首頁>技術>

通常我們會將程式語言分為靜態和動態。靜態語言的變數是在記憶體中的有型別的且不可變化的,除非強制轉換它的型別;動態語言的變數是指向記憶體中的標籤或者名稱,其型別在程式碼執行過程中會根據實際的值而定。Python就是典型的動態語言。

1、動態新增屬性

當類或者物件的屬性在需要增加的時候,對於不方便修改原始碼的情況下,我們可以選擇動態的對其新增屬性。

1.1、動態給物件新增屬性

物件屬性只在當前物件生效,在其他物件中是無法呼叫的。

定義一個類:

class Student(object):    def __init__(self,name,age):        self.name=name        self.age=age

執行:(給例項新增數學成績屬性並且初始化)

>>> from payhlib import Student >>> s=Student('phyger',18) >>> s.name'phyger'>>> s.age18>>> s.math_score=100>>> s.math_score    100>>> ss=Student('xiaopang',28)>>> ss.name'xiaopang'>>> ss.age 28>>> ss.math_scoreTraceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: 'Student' object has no attribute 'math_score'>>>

1.2、動態給類新增屬性

類屬性在其所有的物件中都生效。

執行:(預設所有物件的音樂成績為60,當然你也可以對其進行修改)

>>> from payhlib import Student>>> Student.music_score=60>>> s1=Student('phyger',19) >>> s1.name'phyger'>>> s1.age19>>> s1.music_score60>>> s2=Student('xiaopang',29)>>> s2.music_score60>>>

2、動態新增方法

當類或者物件的方法在需要增加的時候,對於不方便修改原始碼的情況下,我們可以選擇動態的對其新增方法。

2.1、動態給物件新增方法

給物件新增的方法只繫結在當前物件上,不對其他物件生效,而且需要傳入self引數。

執行:(透過types.MethodType方法給a物件繫結sayhi方法)

>>> from payhlib import Student>>> a=Student('phyger',17) >>> def sayhi(self):...     print('hi...')... >>> a.sayhi()Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: 'Student' object has no attribute 'sayhi'>>> import types  >>> a.sayhi=types.MethodType(sayhi,a)>>> a.sayhi()hi...>>> b=Student('xiaopang',27) >>> b.sayhi()Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: 'Student' object has no attribute 'sayhi'>>>

2.2、動態給類新增方法(類方法和靜態方法)

給類新增的方法對它的所有物件都生效,新增類方法需要傳入self引數,新增靜態方法則不需要。

執行:(給類新增靜態方法)

>>> from payhlib import Student                 >>> stu = Student('phyger',16)>>> @staticmethod... def staticHi():...     print('staticHi...')... >>> Student.hi=staticHi  >>> stu.hi<function staticHi at 0x000001CB617F13A8>>>> stu.hi()staticHi...>>>

執行:(給類新增類方法)

因為類方法只能使用類變數,所以我們增加一個類變數home

class Student(object):    home='china'    def __init__(self,name,age):        self.name=name        self.age=age
>>> from payhlib import Student>>> stu = Student('phyger',17)  >>> @classmethod        ... def classHi(self):  ...     print(self.home)... >>> Student.chi=classHi>>> stu.chi()china>>>

3、限制給類或物件新增的屬性

假如我們只希望類或者物件有name,age,score三個屬性,我們可以藉助__slots__來做,而且無法新增其他屬性。

修改類:

class Student(object):    home='china'    __slots__=('name','age','score')   #init中變數必須在__slots__中    def __init__(self,name,age):        self.name=name        self.age=age

執行:

>>> from payhlib import Student>>> st = Student('phyger',16)>>> st.name 'phyger'>>> st.age 16>>> st.scoreTraceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: score>>> st.score =100>>> st.score      100>>> st.phone='123'      #無法新增phone屬性Traceback (most recent call last):  File "<stdin>", line 1, in <module>AttributeError: 'Student' object has no attribute 'phone'>>>

多總結幾點:

類屬性是read-only的靜態方法無法使用類變數類方法只能使用類變數,不能使用初始化變數__slots__資料型別為元組__slots__只對當前類生效,對其子類不生效

19
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • 用 Python 爬取各類基金資料並動態展示