1. 程式人生 > >Python-動態新增屬性和方法

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