1. 程式人生 > >python 動態屬性

python 動態屬性

定義 print 傳遞 set class col id屬性 兩種 動態

先來看一下一個常見的Python類的定義:

class Person(object):
    name = None
    age  = None

    def __init__(self,name,age):
        self.name = name
        self.age = age


if __name__=="__main__":

    p = Person(name=jianglegege,age=16)
    print(p.name,p.age) # jianglegege 16

來一個需求:

  每一個person實例都要有一個sid屬性用來記錄社保號

  寫法 1): 直接改Person類

class Person(object):
    name = None
    age = None
    sid = None

    def __init__(self,name,age,sid):
        self.name = name
        self.age = age
        self.sid = sid

  寫法 2):創建完實例後單獨為實例設置sid屬性

class Person(object):
    name = None
    age = None

    def __init__
(self,name,age): self.name = name self.age = age if __name__=="__main__": p = Person(name=jianglegege,age=16) p.sid = 9527 print(p.name,p.age,p.sid)

這兩種寫法各自的問題:

  1、對於第一種寫法如果再來一個需求你又要改動Person類的定義、你這個類封閉不了。

  2、對於第二種寫法要求在創建完成Person實例後都要記得為實例增加一個sid屬性、而它和第一種一樣在應對新的需求

  方面也同樣的不靈活

一種靈活的寫法:

class Person(object):
    name = None
    age = None

    def __init__(self,*args,**kwargs):
        for k,v in kwargs.items():
            setattr(self,k,v)



if __name__=="__main__":

    p = Person(name=jianglegege,age=16,sid=9527)
    print(p.name,p.age,p.sid)

通過上面的寫法有兩個好處 1):Person類現在直接任意多屬性了、2):Person類也被封閉了 ;但是它也有一個不好的地方,比較有在創建p實例的時候沒有

傳遞sid這個值給構造函數,那麽p實例就不會有這個屬性。

-----

python 動態屬性