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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM