まず、データメンバ(属性)
オブジェクトのデータメンバとクラスのメンバに属するデータ:データメンバーは、2つのカテゴリに分けることができます。
- オブジェクト・データ・メンバーに属する定義し、接頭辞、同じクラスの異なるオブジェクトとして、自己への方法の例では、データメンバにアクセスするときに設定方法で定義され、典型的には__init __()、もちろん、実施例(プロセスの他のメンバーに定義されます)同時に、データメンバ;
- クラス・データ・メンバーに属するが、そのクラスのすべてのオブジェクトによって共有され、このクラスのデータメンバを定義する一般的な方法の任意のメンバーを定義していない場合、どのオブジェクトにも属していません。
第二に、メンバーメソッド
Pythonのクラスのメンバメソッドはpublicメソッド、プライベートメソッド、静的メソッド、クラスメソッド、これらのタイプに分けることができます。
-
パブリック・メソッド、プライベートメソッドは、一般的にインスタンスメソッドを示し始め、抽象メソッドは、一般的に抽象クラスで定義されており、派生クラスが再実装しなければならない要件「__」2つのアンダースコアでのオブジェクト、プライベートメソッドの名前に属します。各オブジェクトは、メンバーがアクセスすることができる方法のこれらの2つのタイプの公共および民間のメソッドの独自の方法は、クラスやオブジェクトに属しています。
-
公開の方法は、直接オブジェクト名「オブジェクト名。パブリックメソッド(<引数>)」を通じて呼び出さプライベートメソッドは直接オブジェクトの名前を呼ぶことができない、外部のフォーム特別によってのみ自己のプレフィックス法や他の例で呼び出すことができますコール。
-
方法の全ての実施例は、少なくとも一つの呼び出されている必要があり、自己のパラメータ及び(複数のパラメータの単語がある場合に)第一プロセスパラメータである必要があり、自己パラメータは、現在のオブジェクトを表します。
-
自己する必要があるが、インスタンスメソッドにアクセスインスタンスメンバーに接頭辞が、外部によるオブジェクト名は、オブジェクトのメソッドを呼び出すときに、この引数を渡す必要はありません。
-
介して外部場合は、クラス名オブジェクトの呼び出しに属するpublicメソッド、明示的に使用されているオブジェクト名を渡すパラメータ自己の明示的な方法の必要性は、オブジェクトにアクセスするメンバーを指定します。
-
静的メソッドとクラスメソッドがコールにクラス名とオブジェクト名を介して使用できますが、直接オブジェクトに属するメンバーにアクセスすることはできません、クラスのメンバーのみにアクセスすることができます。
-
静的メソッドおよび方法はない任意のインスタンスにバインドされた任意のクラスのインスタンスに属していない、もちろん、インスタンスのいずれかの状態に依存しない、それは方法のオーバーヘッドの多くの例と比較して減少させることができます。
-
この方法は、一般に、クラス略記CLSのクラスのクラスメソッドは、最初のパラメータ自体、パラメータ渡しのクラス値を必要としないメソッドを呼び出すときに、静的メソッドは、任意のパラメータを受信することができないことによって表されるように。
>>> class Root:
__total = 0
def __init__(self, v): #构造方法
self.__value = v
Root.__total += 1
def show(self): #普通实例方法
print('self.__value:', self.__value)
print('Root.__total:', Root.__total)
@classmethod #修饰器,声明类方法
def classShowTotal(cls): #类方法
print(cls.__total)
@staticmethod #修饰器,声明静态方法
def staticShowTotal(): #静态方法
print(Root.__total)
>>> r = Root(3)
>>> r.classShowTotal() #通过对象来调用类方法
1
>>> r.staticShowTotal() #通过对象来调用静态方法
1
>>> r.show()
self.__value: 3
Root.__total: 1
>>> rr = Root(5)
>>> Root.classShowTotal() #通过类名调用类方法
2
>>> Root.staticShowTotal() #通过类名调用静态方法
2
>>> Root.show() #试图通过类名直接调用实例方法,失败
TypeError: unbound method show() must be called with Root instance as first argument (got nothing instead)
>>> Root.show(r) #但是可以通过这种方法来调用方法并访问实例成员
self.__value: 3
Root.__total: 2
>>> Root.show(rr) #通过类名调用实例方法时为self参数显式传递对象名
self.__value: 5
Root.__total: 2
第三に、method属性
- 使用@porpertyデコレータの装飾方法は、プログラムは、それによって、よりユーザーフレンドリーなアクセスを提供する、プロパティへのアクセス「と」機能させることができます。
属性だけを読みます
>>> class Test:
def __init__(self, value):
self.__value = value
@property
def value(self): #只读,无法修改和删除
return self.__value
>>> t = Test(3)
>>> t.value
3
>>> t.value = 5 #只读属性不允许修改值
AttributeError: can't set attribute
>>> t.v=5 #动态增加新成员
>>> t.v
5
>>> del t.v #动态删除成员
>>> del t.value #试图删除对象属性,失败
AttributeError: can't delete attribute
>>> t.value
3
読み取り可能、書き込み可能なプロパティ:
>>> class Test:
def __init__(self, value):
self.__value = value
def __get(self):
return self.__value
def __set(self, v):
self.__value = v
value = property(__get, __set)
def show(self):
print(self.__value)
>>> t = Test(3)
>>> t.value #允许读取属性值
3
>>> t.value = 5 #允许修改属性值
>>> t.value
5
>>> t.show() #属性对应的私有变量也得到了相应的修改
5
>>> del t.value #试图删除属性,失败
AttributeError: can't delete attribute
読むには、削除のプロパティを変更します。
>>> class Test:
def __init__(self, value):
self.__value = value
def __get(self):
return self.__value
def __set(self, v):
self.__value = v
def __del(self):
del self.__value
value = property(__get, __set, __del)
def show(self):
print(self.__value)
>>> t = Test(3)
>>> t.show()
3
>>> t.value
3
>>> t.value = 5
>>> t.show()
5
>>> t.value
5
>>> del t.value #删除属性
>>> t.value #对应的私有数据成员已删除
AttributeError: 'Test' object has no attribute '_Test__value'
>>> t.show()
AttributeError: 'Test' object has no attribute '_Test__value'
>>> t.value = 1 #为对象动态增加属性和对应的私有数据成员
>>> t.show()
1
>>> t.value
1