プロパティの例を制限する__slots__のpython3

通常の状況下では、我々は、クラスを定義する場合、クラスのインスタンスを作成し、我々は実施例に任意のプロパティとメソッドを結合することができ、これは動的言語の柔軟性です。ファーストクラスを定義します。

# 类定义
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__

公開された343元の記事 ウォン称賛57 ビュー20万+

おすすめ

転載: blog.csdn.net/jadeshu/article/details/103739275