クラス
公式サイト:
使い方
参考:
導入
参考:
概要
参考:
クラスを理解、オブジェクト指向プログラミングの基本を押さえる | 日経クロステック
継承
参考:
クラスの継承に関する知識と方法のまとめ | HEADBOOST
初期化
子クラスを初期化する例
class SubClass(SuperClass):
def __init__(self, value, **kw)
super().__init__(**kw)
self.var = value
Code language: Python (python)
子クラスで __init__
を定義しなかった場合は、親クラスの __init__
がそのまま呼ばれる。子クラスで __init__
を定義した場合は、親クラスの __init__
を明示的に呼び出す必要がある。
参考:
継承と super() を使って派生クラスを init してみよう – Qiita
How do I initialize the super class? – Stack Overflow
What happens if define a class without __init__ method? – Stack Overflow
multiple inheritance passing arguments to constructors using super – Stack Overflow
Introspecting arguments from the constructor function __init__ – Stack Overflow
Implicitly invoking parent class initializer – Stack Overflow
Understanding super() with __init__() methods – Stack Overflow
コンストラクタのオーバーロード
参考:
How to overload __init__ method based on argument type? – Stack Overflow
変数のスコープ
- インスタンス変数
- クラス変数
参考:
クラス変数とインスタンス変数を取り違えてハマった – Qiita
クラス変数とインスタンス変数の違い | AI Academy Media
accessing super class variable in child class – Stack Overflow
super
参考:
プロパティ
@property
@property_name.setter
ドキュメント:
property | Python 3.x ドキュメント [公式]
参考:
プロパティについて理解したのでまとめる | nametake-blog
@property によるプロパティへのアクセス制御のまとめ | HEADBOOST
インスタンス変数の入力値をバリデーションする方法 | DevelopersIO
プロパティの getter / setter は不要、それがパイソニック | のーずいだんぷ
What’s the pythonic way to use getters and setters? – Stack Overflow
プロパティをまとめて設定する
参考:
Setting multiple object attributes at once – Stack Overflow
short syntax for accessing multiple properties – Stack Overflow
クラス変数
ドキュメント:
ClassVar – typing | Python 3.x ドキュメント [公式]
PEP 526 – Syntax for Variable Annotations | Python.org [Official]
参考:
How to extract type from class property? (runtime type annotation check) – Stack Overflow
How to get class variables and type hints? – Stack Overflow
多重継承
参考:
How does super() work with multiple inheritance? – Stack Overflow
Calling parent class __init__ with multiple inheritance, what’s the right way? – Stack Overflow
判別する
isclass
isinstance
type
issubclass
参考:
type 関数/isinstance 関数 – 型を取得/判定する | note.nkmk.me
isinstance
オブジェクトが指定したクラスのインスタンスかどうか判定する。
class Derived(Base):
pass
obj = Derived()
if isinstance(obj, Base):
print("Yay!")
Code language: Python (python)
ドキュメント:
isinstance | Python 3.x ドキュメント [公式]
参考:
isinstance 関数の使い方/オブジェクトのデータ型を判定する | JavaDrive
クラスメソッド (@classmethod)
参考:
クラスメソッドの定義の仕方と staticmethod との違い | St_Hakky’s blog
メンバアクセス
クラス内でメンバにアクセスする場合は self.
を付ける。
class Test(Base):
# ...
def do_something():
self.prop_name = self.method_name(123)
Code language: Python (python)
参考:
クラス内のメソッドを別のメソッド内で使う方法 – teratail
メンバの一覧を取得する
__dict__
dir()
ドキュメント:
object.__dict__ | Python 3.x ドキュメント [公式]
参考:
what’s the biggest difference between dir and __dict__ in python – Stack Overflow
Explain __dict__ attribute – Stack Overflow
What is the __dict__.__dict__ attribute of a Python class? – Stack Overflow
プロパティを安全に取得する (getattr)
ドキュメント:
getattr | Python 3.x ドキュメント [公式]
参考:
getattr() はオブジェクトの属性の値を返す | コムテブログ
Python の getattr 関数で属性を取得する | 小さなことをやってみるブログ
プロパティの型を取得/判定する
参考:
How to get type of object’s attribute – Stack Overflow
How to get type hints for an object’s attributes? – Stack Overflow
親クラスの一覧を取得する (__mro__)
参考:
サブクラス/スーパークラスを確認/issubclass / __mro__ など | note.nkmk.me
Getting all superclasses – Stack Overflow
メソッドとは/関数とメソッドの違い
- 関数:引数を取り、戻り値を返す。
- メソッド:クラス内に定義された関数でオブジェクトのインスタンスに対して実行される。
参考:
プライベートメンバ
参考:
クラス内からしか呼び出さないメソッドを明示する方法はないでしょうか? – スタック・オーバーフロー
__new__
参考:
__new__ と __init__ とメタクラスと – Qiita
__new__ と __init__ の違いについて/具体例と解説 | babaye’s notes
__new__ と __init__/クラスコンストラクター | システムトラスト技術ブログ
patching __new__ method – Stack Overflow
error when running __new__? not invoking __init__ – Stack Overflow
__props__ / __init_subclass__
参考:
Accessing super class variable – Stack Overflow
metaclasses
参考:
What are metaclasses in Python? – Stack Overflow
object
参考:
クラス継承で object クラスを継承する理由 – teratail
Why do Python classes inherit object? – Stack Overflow
How can I create an object and add attributes to it? – Stack Overflow
キャストしたい
参考:
型式では呼び出し式を使用できません
現象:
次のようなコードを書く。
var: Sample('hoge', 'fuga', 'piyo')
警告が発生する。
型式では呼び出し式を使用できません
原因:
- アノーテーションに引数を与えている。
対処法:
アノーテーションには型のみを与え、その後に代入演算子 (=
) を続けて初期化する。
var: Sample = Sample('hoge', 'fuga', 'piyo')
参考:
What are variable annotations? – Stack Overflow
Tips
関数とクラスの呼び出し/関数の引数を関数にすることの有用性やクラスの継承など – Qiita
オブジェクトの中身を確認したい場合に試すこと | naka-c