動態語言(python)如何給類和例項繫結方法

2021-08-21 15:38:25 字數 2286 閱讀 5275

在建立乙個class時,我們可以直接在建立時給類(class)新增方法,例如:

>>> class student(object):

def __init__(self, name, age, score):

self.name = name

self.age = age

self.score = score

>>> s1 = student('bob', 23, 95)

>>> s1.name

'bob'

>>> s1.age

23>>> s1.score

95

與此同時,也可在class建立之後,再給類及例項繫結方法,例如:

1. 給例項繫結方法

>>> class student(object):

pass

>>> s1 = student()

>>> s2 = student()

>>> from types import methodtype

>>> def set_age(self, age):

self.age = age

>>> s1.set_age = methodtype(set_age, s1)

>>> s2.set_age = methodtype(set_age, s2)

>>> s1.set_age(20)

>>> s1.age

20>>> s2.set_age(30)

>>> s2.age

30

利用types模組中的methodtype函式來為例項s1,s2繫結方法。

2. 給類(class)繫結方法

>>> def set_score(self, score):

self.score = score

>>> student.set_score = set_score

>>> s1.set_score(90)

>>> s1.score

90>>> s2.set_score(100)

>>> s2.score

100

給類繫結的方法同樣適用與s1、s2例項。

__slots__變數

使用__slots__變數可以限制類以及例項的屬性,例如:

>>> class student(object):

__slots__ = ('name', 'age')

>>> s1 = student()

>>> s1.name = 'a'

>>> s1.age = 24

>>> s1.score = 90

traceback (most recent call last):

file "", line 1, in s1.score = 90

attributeerror: 'student' object has no attribute 'score'

使用__slots__變數限制屬性為name、age,故給例項新增score屬性,將出現attributeerror錯誤。

若使用__slots__變數僅對當前類例項起作用,對繼承的子類不起作用,例如:

>>> class graduatestudent(student):

pass

>>> g = graduatestudent()

>>> g.score = 98

除非存在在父類和子類都定義了__slots__變數,這樣子類例項允許定義的屬性就是子類的和父類__slots__相加的範圍,例如:

>>> class student(object):

__slots__ = ('name', 'age')

>>> class juniorstudent(student):

__slots__ = ('name', '***')

>>> j = juniorstudent()

>>> j.name = 'tom'

>>> j.age = 20

>>> j.*** = 'male'

>>> j.score = 100

traceback (most recent call last):

file "", line 1, in j.score = 100

attributeerror: 'juniorstudent' object has no attribute 'score'

Python語言 類和物件

使用python版本 python2.7 定義乙個名為classname的類,它含有乙個變數,乙個方法 metaclass type 必須有 defclass classname variety 15 defmethod self print in method 注意 在這個位置的variety位於...

python如何給字典排序

在python裡,字典dictionary是內建的資料型別,是個無序的儲存結構,每一元素是key value對 如 dict 其中 username 和 password 是key,而 xiaoming 和 123456 是value,可以通過d key 獲得對應值value的引用,但是不能通過va...

細說python類2 類動態新增方法和slots

先說一下類新增屬性方法和例項新增屬性和方法的區別,類新增屬性屬於加了乙個以類為全域性的屬性 據說叫靜態屬性 那麼以後類的每乙個例項化,都具有這個屬性。給類加乙個方法也如此,以後類的每乙個例項化都具備這個方法 但是據說叫動態方法。但是給例項加乙個屬性,作用域就是這個例項,是與類沒關係的 據說這種屬性叫...