通常の状況下では、我々は、クラスを定義する場合、クラスのインスタンスを作成し、我々は実施例に任意のプロパティとメソッドを結合することができ、これは動的言語の柔軟性です。ファーストクラスを定義します。
# 类定义
class Person(object):
pass
次に、インスタンスにプロパティをバインドしよう:
p = Person()
p.name = "jadeshu"
print(p.name)
出力:jadeshu
また、インスタンスにメソッドをバインドしようとすることができます。
# 类定义
class Person(object):
pass
p = Person()
p.name = "jadeshu"
print(p.name)
def set_age(self, age): # 定义一个函数作为实例方法
self.age = age
from types import MethodType
p.set_age = MethodType(set_age, p)
p.set_age(25)
print(p.age)
出力:jadeshu
25
しかし、例を結合する方法は、別の例では動作不能です。
p2 = Person() #创建新的实例
p2.set_age(25) #调用方法
エラー:
Traceback (most recent call last):
25
File "C:/Users/Administrator/Desktop/PycharmProjects/test.py", line 48, in <module>
p2.set_age(25)
AttributeError: 'Person' object has no attribute 'set_age'
メソッドをバインドされているすべてのインスタンスを与えるために、この方法は、クラスにバインドすることができます。
def set_score(self, score):
self.score = score
Person.set_score = set_score
p.set_score(80)
print(p.score)
出力:80
クラスメソッドに結合した後、すべてのインスタンスを呼び出すことができます。
p.set_score(80)
p2 = Person()
p2.set_score(100)
print(p.score)
print(p2.score)
出力:80
100
一般に、上記set_score
の方法は、クラス内で直接定義することができるが、動的バインディングは、私たちは、静的な言語で実現することは困難である機能を、実行中のプログラム中のクラスに動的に追加することを可能にします。
使用__slots__
しかし、私たちが行う方法のインスタンスを制限したい場合はプロパティ?たとえば、唯一の学生インスタンスの追加name
およびage
属性を。
限定の目的を達成するために、Pythonはクラス時間の定義を可能にする、特定の定義__slots__
クラスのインスタンスの属性を制限する変数を追加することができます。
class Person(object):
__slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
その後、我々は試してみてください。
>>> s = Person() # 创建新的实例
>>> s.name = 'jadeshu' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
以下のために'score'
置かれていない__slots__
で、それがバインドすることはできませんscore
プロパティがバインドしようとするscore
取得するためにAttributeError
間違っています。
使用すると__slots__
、注目すべきである__slots__
機能を属性、継承のサブクラスが動作しないだけで、現在のクラスのインスタンスに定義されました:
>>> class Student(Person):
... pass
...
>>> s = Student()
>>> s.score = 9999
あなたはサブクラスを定義しない限り__slots__
、サブクラスのインスタンス属性は、それ自体許可するように定義されるように、__slots__
プラス親クラスを__slots__
。