Python-動態新增屬性和方法
class Person():
Country='CN'
def __init__(self,nm)
self.nm=nm
動態新增例項屬性及例項方法:
p=Person()
p.age=18 #直接賦值,動態新增例項屬性
def set_age(self,age) #定義帶self變數的函式
self.age=age
def set_nm(self,nm) #定義帶self變數的函式
self.nm=nm
from types import MethodType
p.set_age=MethodType(set_age,p) #對例項進行動態新增例項方法,僅該例項有效
Person.set_age=MethodType(set_age,Person) #對類動態新增例項方法,引數更改為類名即可,所有例項有效
Person.set_nm=set_nm #直接賦值,對類動態新增例項方法,所有例項有效
Person.sex='M' #直接賦值,動態新增類屬性,所有例項有效
動態新增類方法或靜態方法:
@classmethod #使用此修飾器
def cnm(cls): #使用cls作為傳入的類物件
cls.Country='China' #只對類屬性操作
Person.cnm = cnm # 直接賦值即可,動態新增類方法
@staticmethod #使用靜態修飾器
def snm(): #無引數
pass
Person.snm = snm # 直接賦值,動態新增靜態方法
__slots__限制動態新增屬性或方法:
class Study():
__slots__=('name','age',)
pass
該類中只允許動態新增name,age屬性,其他屬性及方法無法動態新增。
__slots__只對當前類有效,繼承無效。只適用於例項屬性和例項方法。
若子類中無定義__slots__則子類不受父類的限制,若子類定義,則會繼承父類__slots__.
在類的__init__ 等方法中定義的屬性都是動態的,都受到__slots__的限制。
在__init__ 等方法的執行過程中,定義的屬性跟通過動態增加的例項屬性是一樣的,都是動態的。
通過增加例項方法,受到__slots__的限制,但在類的宣告中通過def實現的方法是不受__slots__限制的,因為在類的宣告中實現的方法是靜態的。