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__限制的,因為在類的聲明中實現的方法是靜態的。
