クラスのオブジェクト指向メンバー1--
オブジェクト指向三つの特徴:1.パッケージ2. 3.多型の継承
行うことができますオップは、コード、コードの冗長性を打破し、既存のコードを最小化してからではなく、コードフィールドを変更するよりも、カスタムプログラムを書く、あるいはゼロからスタートです
まず、クラスのメンバー:
分野:通常のフィールド、静的フィールド
2.方法:一般的な方法、クラスメソッド、静的メソッド
3. [プロパティ
class Person:
country = 'CN' #静态字段
__money = 99999 #私有静态字段
def __init__(self,name):
self.name = name #普通字段
self.__age = 30 #私有普通字段
def show(self): #普通方法
self.__think()
return self.__age
@classmethod #类方法
def cls_func(cls):
return cls.__money
@staticmethod
def static_func():
return 123
@property
def nature(self): #属性
return '鸽子'
def __think(self): #私有方法
return '画个圈圈'
静的フィールドは、メモリ内の一つだけを残して、クラスに属します
一般的なフィールドは、各オブジェクトがそれぞれに保存され、オブジェクトに属します
一般的な方法は、オブジェクトによって呼び出され、自己の少なくとも1つのパラメータを含むオブジェクトに属します
クラスメソッドの呼び出しによってクラス、含む少なくとも1つのパラメータCLS、
静的なクラスメソッドは、パラメータなしの自己と呼ばれていません
プロパティデコレータを使用して、上記定義された2つの形式があり、以下の実施形態は、静的フィールドです
def nature(self):
return '鸽子'
na = property(nature)
公私
プライベート静的フィールドは、__money = 99999, 错误:Person.__money
間接的な方法でアクセスすることができ、
プライベートフィールド、self.__age = 30,错误:obj.__age
プライベートメソッド、エラー:OBJ .__(だと思います)
*シモンズ:オブジェクト._クラスをすることができます、プライベートプロパティにアクセスする必要が__属性名* obj._Person__money
自己
自己は、通常、クラスのメソッドへの最初のパラメータの名前は、Pythonは自動的に場所が鍵であり、(つまり、暗黙的にmainメソッドの呼び出し)、自己と呼ばれていなくてもオブジェクトのインスタンスに入力されます。
第二に、特別会員(一部)
__init__ __str__ __call__ __add__ __dict__ __doc__ __name__
__getitem__ __setitem__ __delitem__
__getattr__ __setattr__
class A:
'''nothing....'''
def __init__(self,data):
self.data = data
def __str__(self,data):
return self.data
def __call__(self):
print('Hellow')
def __add__(self,other):
return self.data + other
__init__
#コンストラクタは、各インスタンスが作成されると、Pythonは自動的にそれを呼び出します、明示的に渡されたパラメータに加えて、クラスだけでなく、目に見えない、着信新しいインスタンスに名前を付けます。
__str__
あなたがオブジェクトを印刷したい場合には、実行しています__str__
__add__
オブジェクトが実行され、「+」という表現に表示されます__add__
__call__
オブジェクトが呼び出されると、実行されます__call__
__dict__
すべてのメンバーは、すべてのクラスやオブジェクトの辞書を返します
__doc__
クラスの記述情報に戻ります
__name__
クラスの名前を返します。
a = A(1)
print(a) # A
a() # Hellow
print(a + 2) # 3
print(a.__dict__) # {'data': 1}
print(a.__doc__) #nothing...
print(a.__class__.__name__) # A
定義されていない__dict__
と__doc__
、なぜ与えられていませんか?、しかし、また、すべてのクラスがデフォルトのオブジェクト;:クラスA(オブジェクト)を継承するため 、 再定義は、元の関数を上書きし、意味がありません。
class B:
def __init__(self,number):
self.number = number
self.dic = {'k1':1,'k2':2,'k3':3,}
def __getitem__(self, key):
return self.dic[key]
def __setitem__(self, key, value):
self.dic[key] = value
def __delitem__(self, key):
del self.dic[key]
b =B(88)
n = b['k1'] #触发 __getitem__
print(n) # 1
b['k4'] = 4 #触发 __setitem__
print(b.dic) #{'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
del b['k2'] #触发__delitem__
print(b.dic) #{'k1': 1, 'k3': 3, 'k4': 4}
class C:
pass
c = C()
c.name = 'Sroxi'
print(c.name) # Sroxi
クラスCは、任意の定義されずに、c.name =「Sroxi」を実現する方法ですか?
-オブジェクトのトリガー__setattr__
メソッドを、サブクラスは同じを書き換えるしても意味がありません。
class Foo:
def __init__(self):
object.__setattr__(self, 'info', {}) #在对象中设置值的本质,注意:这里info带引号
def __setattr__(self, key, value):
#c.name = 'Sroxi',触发该方法,在object中有字典这样的容器进行接收
self.info[key]=value
def __getattr__(self, item):
#c.name触发该方法,将字典中的对应的value进行返回
return self.info[item]