Atsuhiko / Web-App

Webアプリ研究会
2 stars 2 forks source link

Pythonオブジェクト指向 #11

Open yuyuyuriko78 opened 4 years ago

yuyuyuriko78 commented 4 years ago

自作モジュール作成

モジュールとは

src/user.py

class User:

  # コンストラクタ
  def __init__(self, name):
    self.name = name

  def hello(self):
    print("Hello How are you?,{}".format(self.name))

# プログラムがメインスクリプトとして実行されている場合、__name__の値が__main__になる。
if __name__ == '__main__' :
  u1 = User("Jiro")
  u1.hello()

main.py

# ファイル名から拡張子(.py)を除く
# 異なる階層(srcディレクトリ内)にモジュールを含むファイルがいる場合:
#   「ディレクトリ名.ファイル名(拡張子なし)」のように、ドットを用いて階層を表現する。
# from モジュール名 import 使いたいクラス

from src.user import User

if ___name__ ==  '__main__':
  # 特定のクラスをimportしているので、クラス名の前にファイル名は不要。
  u1 = User("Jiro")
  u1.hello()
yuyuyuriko78 commented 4 years ago

モジュールのインポートの仕方

import につづくものがモジュールとして読み込まれる。

ファイルをモジュールとしてインポートする

例:srcディレクトリ内の「user.py」ファイルをインポートする import src.user

ファイル内の特定のクラスをモジュールとしてインポートする

例:srcディレクトリ内の「user.py」ファイル内の「User」クラスをインポートする from src.user import User

クラスではなくファイルを読み込み使いたいが、使うとき長いのは嫌なとき

例:srcディレクトリ内の「user.py」ファイルをモジュールとしてインポートし、その中のUserクラスを使いたいとき import src.user as my_user

Atsuhiko commented 4 years ago

柿埜さん、ありがとうございます。 わたしも何となくこの辺りは知っていましたが、頭が整理されました!

yuyuyuriko78 commented 4 years ago

メソッドあれこれ

スタティックメソッド

プライベートメソッド

Atsuhiko commented 4 years ago

そうだったんですか。プライベートメソッドは使ったことがなかったです。 でもインスタンスで使えないメソッドって、どういう状況で使ったらよいのでしょうか?事例があったら教えてください。

yuyuyuriko78 commented 4 years ago

そうだったんですか。プライベートメソッドは使ったことがなかったです。

pythonでは中身をオープンにすることにより価値を置くとのことで、あまり使われないようです!

インスタンスで使えないメソッドって、どういう状況で使ったらよいのでしょうか?事例があったら教えてください。

そういわれてみるとそうですね・・・さがしてみます!

yuyuyuriko78 commented 4 years ago

クラスの継承

from 親クラスを含むファイル名 import 親クラス名
class 子クラス( 親クラス ):
  処理
yuyuyuriko78 commented 4 years ago

メソッドのオーバーライド

Atsuhiko commented 4 years ago

クラスの継承は会社の勉強会で今しているところです。コードの共有は出来ませんが、また事例の紹介はしますね。

演習問題4 クラスの継承を用いたコードを作成してください。 参考:https://blog.codecamp.jp/python-class-2

Atsuhiko commented 4 years ago

そうだったんですか。プライベートメソッドは使ったことがなかったです。

pythonでは中身をオープンにすることにより価値を置くとのことで、あまり使われないようです!

インスタンスで使えないメソッドって、どういう状況で使ったらよいのでしょうか?事例があったら教えてください。

そういわれてみるとそうですね・・・さがしてみます!

Python ではあまり使われないのであれば、事例は探さなくてもよいですよ。それよりWebアプリの作成に注力しましょう。

yuyuyuriko78 commented 4 years ago

デコレータ

pythonの主なデコレータ

@classmethod

@staticmethod

Atsuhiko commented 4 years ago

デコレーター自体は、他人のコードを読み解くと為に知識としては知っていましたgあ、まだ自分でつあったことはありません。こうして整理していただくと、非常に参考になります。

yuyuyuriko78 commented 4 years ago

列挙型 enum

from enum import Enum

class Grade(Enum):
  HANAKO = 1
  TARO = 2
  SABURO = 3

  def __str__(self):
    if self == Grade.HANAKO:
      return "花子です"
    if self == Grade.TARO:
       return "太郎です"
    if self == Grade.SABURO:
      return "三郎です"

if __name__ == '__main__':
  # 添え字でアクセスできる
  print(Grade.TARO)
  # インデックスでもアクセスできる
  print(Color(1))
class Car(Enum):
  AUDI = 0
  BMW = 1
  BENZ = 2

tt = Car.AUDI

print(tt.name)  # => 'AUDI'
print(value)  # => 0
Atsuhiko commented 4 years ago

ライブラリの中のクラスを呼び出すのがまさにこの構文ですね。 import pandas as pd import numpy as np のようにライブラリを省略して引用するのは、自分で作ったクラスでもできるのしょうか?

yuyuyuriko78 commented 4 years ago

@Atsuhiko https://uxmilk.jp/23001 このサイトでは「test_module」を「test」として読み込んでるので、大丈夫そうです!

yuyuyuriko78 commented 4 years ago

ランダムに値をとる

yuyuyuriko78 commented 4 years ago

特殊メソッド

★「__init__」

★「__str__」

class Person:
  def __init__(self, name, age):
    self._name = name
    self._age = age
  def __str__(self):
    return '{0}さんは{1}歳です'.format(self.name, self.age)
hanako = Person("Hanako", 21)
print(hanako)
# 結果は「Hanakoさんは21歳です」

参考: strreprについて Pythonの特殊メソッド

yuyuyuriko78 commented 4 years ago

先頭のアンダースコア