python 定义method_python进阶14:实例方法和类方法、types.MethodType()
1 實例方法
一個實例的私有屬性就是以__開頭的屬性,無法被外部訪問,那這些屬性定義有什么用?雖然私有屬性無法從外
部訪問,但是,從類的內部是可以訪問的。除了可以定義實例的屬性外,還可以定義實例的方法。實例的方法就是在
類中定義的函數,它的第一個參數永遠是 self,指向調用該方法的實例本身,其他參數和一個普通函數是完全一樣
的:
class Person(object):
def __init__(self, name):
self.__name = name
def get_name(self):
return self.name
get_name(self) 就是一個實例方法,它的第一個參數是self。__init__(self, name)其實也可看做是一個特殊的
實例方法。調用實例方法必須在實例上調用:
>>> p1 = Person('Bob')
>>> print p1.get_name() #self不需要傳入
Bob
在實例方法內部,可以訪問所有實例屬性,這樣,如果外部需要訪問私有屬性,可以通過方法調用獲得,這種數
據封裝的形式除了能保護內部數據一致性外,還可以簡化外部調用的難度。
2?types.MethodType()
因為方法也是一個屬性,所以,它也可以動態地添加到實例上,只是需要用types.MethodType()把一個函數變
為一個方法:
import types
def fn_get_grade(self):
if self.score >= 80:
return 'A'
if self.score >= 60:
return 'B'
return 'C'
class Person(object):
def __init__(self, name, score):
self.name = name
self.score = score
下面我們將fn_get_grade()方法添加到實例上:
>>> p1 = Person('Bob', 90)
>>> p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
>>> print p1.get_grade()
A
>>> p2 = Person('Alice', 65)
>>> print p2.get_grade()
# ERROR: AttributeError: 'Person' object has no attribute 'get_grade'
因p2實例沒有綁定get_grade方法,所以出現錯誤。
3 定義類方法
和屬性類似,方法也分實例方法和類方法。
在class中定義的全部是實例方法,實例方法第一個參數 self 是實例本身。定義類方法需要在方法前加上
@classmethod:
class Person(object):
count = 0
@classmethod
def how_many(cls):
return cls.count
def __init__(self, name):
self.name = name
Person.count = Person.count + 1
print Person.how_many()
p1 = Person('Bob')
print Person.how_many()
通過標記一個 @classmethod,該方法將綁定到 Person 類上,而非類的實例。類方法的第一個參數將傳入類本
身,通常將參數名命名為 cls,上面的 cls.count 實際上相當于 Person.count。因為是在類上調用,而非實例上調
用,因此類方法無法獲得任何實例變量,只能獲得類的引用。
總結
以上是生活随笔為你收集整理的python 定义method_python进阶14:实例方法和类方法、types.MethodType()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果耳机无线真假测试软件,辨别苹果耳机真
- 下一篇: .net 任务(Task)