日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

__slots__ 和 @property

發布時間:2023/12/31 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 __slots__ 和 @property 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?動態非常靈活, 創建一個class后, 給實例綁定一個屬性:

>>> class Bird: ... pass ... >>> s = Bird() >>> s.name = 'bob' >>> s.name bob

?

也可以給實例綁定一個方法, 但是這對另一個實例是無效的:?

>>> def age(self,age): ... self.age = age ... >>> from types import MethodType >>> >>> s.age = MethodType(age,s,Bird) >>> s.age(0.5) >>> print s.age 0.5>>> s2 = Bird() >>> s2.age(1) Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: Bird instance has no attribute 'age'

?

為了給所有實例都綁定方法,可以給class綁定方法, 綁定后所以屬于該類的實例均可調用:

>>> def is_running(self): ... print 'running...' ... >>> Bird.is_running = MethodType(is_running, None, Bird) >>> s3 = Bird() >>> s3.is_running() running... >>> s2.is_running() running...

?

?__slots__


?

如果我們需要限制class的屬性怎么辦? 比如說我們定義一個Person類, 只允許對Person實例添加 name age屬性, 不允許添加gender屬性! 所以我們需要使用 __slots__

>>> class Person(object): ... __slots__ = ('name','age') ... >>> s = Person() >>> s.name = 'Johb' >>> s.age = '22' >>> s.gender = 'male' Traceback (most recent call last):File "<stdin>", line 1, in <module> AttributeError: 'Person' object has no attribute 'gender'

?

但是對于Person的子類是不起作用的, 除非子類也定義 __slots__

>>> class SuperPerson(Person): ... pass ... >>> s = SuperPerson() >>> s.aaaaa = 'no restriction' >>> s.aaaaa 'no restriction'

?

注意: 因為Python的歷史遺留問題, 在2.x版本中, 如果類后面沒有跟object , ?__slots__的限制將會無效

>>> class Person: ... __slots__=('name','age') ... >>> s.gender = 'male' >>> s.gender 'male'

?

@property

?


如果不對age做限制,我們可以任意設置age的值, 顯然這是不規范的.?

>>> s.age = 99999999 >>> s.age = 'aaaaaa'

當然我們可以麻煩一點, 設置兩個函數:

class Person(object):def get_age(self):return self.agedef set_age(self,value):if not isinstance(value, int):raise ValueError('Age must be an integer')if value < 0 or value > 100:raise ValueError('Age must between 0 ~ 100')self.age = value >>> s = Person() >>> s.set_age(22)
>>> se.get_age()
>>> 22 >>> s.set_age(11111) Traceback (most recent call last): ................................. ValueError: Age must between 0 ~ 100

?

使用更簡單的方法@property,?把一個getter方法變成屬性,只需要加上@property就可以了,此時,@property本身又創建了另一個裝飾器@age.setter,負責把一個setter方法變成屬性賦值.?

class Person(object):@propertydef age(self):return self.age@age.setterdef age(self, value):if not isinstance(value, int):raise ValueError('age must be an integer!')if value < 0 or value > 100:raise ValueError('age must between 0~100')self.age = value>>>s = Person() >>>s.age = 40 >>>s.age 40 >>>s.age = 11111 Traceback (most recent call last): ................................. ValueError: Age must between 0 ~ 100

?

轉載于:https://www.cnblogs.com/zhanhg/p/4395895.html

總結

以上是生活随笔為你收集整理的__slots__ 和 @property的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。