1.クラスオブジェクトとクラス属性
- クラスオブジェクト:クラスオブジェクトは、クラスの定義が実行された後に生成されます
- クラス属性:クラス定義の変数とクラスで定義されたメソッドは、クラスの属性です。
- クラス変数:たとえば、次の名前n個のm eはクラスの変数であります
- クラスの命名:大文字で始まる大きなラクダの場合
class Person:
name = "leo"
def say(self):
print(self.name + ' say hello')
2、インスタンス化
各インスタンス化の後に取得されるインスタンスは、完全に異なるインスタンスです。Pythonクラスがインスタンス化されると、初期化のために__init__メソッドが自動的に呼び出されます。このメソッドの最初のパラメーターは、現在のオブジェクトを参照するselfである必要があります。
class Person:
def __init__(self, name):
self.name = name
def say(self):
print(self.name + ' say hello')
def main():
# 这句话先构造一个全新实例,然后拿着name调用__init__方法,进行出厂配置。然后将配置完成的对象赋给变量leo
leo = Person('leo')
leo.say()
Person.say(leo) # 效果同leo.say()
if __name__ == '__main__':
main()
インスタンス変数とクラス変数
class Person:
age = 20
def __init__(self, name):
self.name = name
def say(self):
print(self.name, "`s age is", self.age) # 直接用age访问不到
上記のクラスでは、年齢年齢a g eはクラス変数であり、すべてのインスタンスの年齢年齢a g e属性は20に初期化され、コピーは独自のオブジェクトスペースに保存され(今回はインスタンス変数になります)、独自のプライベート変数を変更できます。そしてインスタンス変数名名n個のm eは、各インスタンスにプライベートです。
クラス変数は直接変更することもでき、変更後にこのクラスでインスタンス化されたオブジェクトのクラス属性は、変更されたクラス属性です。
Person.age = 100 # 修改类属性
leo = Person('leo')
leo.say() # 100
クラス属性を動的に直接追加することもできます。追加後に元のインスタンスの属性にアクセスすると、独自のプライベートスペースが見つからないため、クラススペースに戻って見つけることができます。
leo = Person('leo')
Person.height = 100 # 动态增加类属性
print(leo.height) # 100
クラススペースとオブジェクトスペース(クラス辞書とオブジェクト辞書)
Person.weight = 120 # 这只是在类空间中增加了weight
leo.weight = leo.weight + 10 # 执行完后,leo的对象空间中就多了weight属性
在レオ。重量=レオ。重量+10 leo.weight = leo.weight + 10L E O 。w e i g h t=L E O 。w e i g h t+では10、レオ。重量leo.weight右側L E O 。W 、E 、I 、Gの時間tがあるの体重重量クラス空間w e i g h t、次にオブジェクトスペースにウェイトウェイトを作成しますw e i g h t属性、受信クラススペースの重み重みW E I Gの時間T + 10
3つの特別な属性
- __ name __:クラス名(文字列)を返します
- __ class __:クラスに属するオブジェクトまたはカスタムクラスを返します
- __ dict __:すべてのプロパティのオブジェクトまたは現在のクラスを返します
leo = Person('leo')
print(leo.__class__) # 返回leo的所属类,<class '__main__.Person'>
print(Person.__class__) # <class 'type'>
print(leo.__dict__) # {'name': 'leo'}
print(Person.__dict__)
print(Person.__name__) # 返回字符串Person
インスタンス属性の検索順序:「。」を使用して属性にアクセスするインスタンスを参照します。そうでない場合は、最初に独自の__dict__を検索し、そうでない場合は__class__を介して独自のクラスを検索し、次にクラスの__dict__を検索します。
4つ、クラスメソッドと静的メソッド
class Person:
def method(self): # 实例方法,第一参数为实例对象
print('method')
@classmethod # 类方法,第一参数为类
def clsmtd(cls):
print(cls)
@staticmethod # 静态方法,没有第一参数,用的少
def stmtd():
print('static')
def main():
Person().method() # 实例调用实例方法
Person.method(Person()) # 效果同上
Person.clsmtd() # @classmethod装饰器会把Person类注入第一参数
Person().stmtd() # 实例对象调用静态方法
Person.stmtd() # 对象调用静态方法
Person().stmtd() # 实例对象调用类方法,装饰器通过__class__提取类传入类方法
クラスメソッド:@ classmethod @ classmethodを使用@ c l a s s m e t h o d装飾されたメソッド、クラスclsclsを受信するための最初のパラメーターがありますc l s、cls clsc l s識別子は任意ですが、読みやすくするために変更することは通常お勧めしません。
静的メソッド:staticmethodstaticmethodを使用しますs t a t i c m e t h o dデコレータメソッドは、最初のパラメータを必要としません。このメソッドがクラススペースに属していることを示しているだけです。
総括する:
- 最初のパラメーターとしてインスタンスオブジェクトを必要とするインスタンスメソッドを除いて、クラスを呼び出すことができます。
- インスタンスは、クラス内のすべてのメソッド(クラスメソッド、静的メソッド、インスタンスメソッドを含む)を呼び出すことができます。インスタンスメソッドはインスタンス自体に渡されます。静的メソッドとクラスメソッドは、インスタンスのクラスを見つける必要があります。