python中方法也是屬性

2021-07-25 22:09:55 字數 1536 閱讀 1616

我們在 class 中定義的例項方法其實也是屬性,它實際上是乙個函式物件:

class person(object):

def __init__(self, name, score):

self.name = name

self.score = score

def get_grade(self):

return 'a'

p1 = person('bob', 90)

print p1.get_grade

# => >

print p1.get_grade()

# => a

也就是說,p1.get_grade 返回的是乙個函式物件,但這個函式是乙個繫結到例項的函式,p1.get_grade() 才是方法呼叫。

因為方法也是乙個屬性,所以,它也可以動態地新增到例項上,只是需要用 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

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

給乙個例項動態新增方法並不常見,直接在class中定義要更直觀。

由於屬性可以是普通的值物件,如 str,int 等,也可以是方法,還可以是函式,大家看看下面**的執行結果,請想一想p1.get_grade 為什麼是函式而不是方法:

class person(object):

def __init__(self, name, score):

self.name = name

self.score = score

self.get_grade = lambda: 'a'

p1 = person('bob', 90)

print p1.get_grade

print p1.get_grade()

?不會了怎麼辦

直接把 lambda 函式賦值給self.get_grade 和繫結方法有所不同,函式呼叫不需要傳入 self,但是方法呼叫需要傳入 self。

python 方法也是屬性

我們在 class 中定義的例項方法其實也是屬性,它實際上是乙個函式物件 class person object def init self,name,score self.name name self.score score defget grade self return a p1 person...

C 中方法,屬性與索引器

c 中方法,屬性與索引器 todo 1,關於系統中常常出現的通過某一字段,查詢相應實體資訊 可能是一條欄位或一條資料和一組泛型集合 解說篇 1,方法,2,屬性3。索引器 1。方法 1。依據狀態編碼返回狀態名稱 一條欄位2。依據狀態返回一條資料 實體 1,依據狀態編碼返回狀態名稱 一條字段 依據狀態返...

Python 類中方法的總結

python類 class 中方法的總結 1 例項方法 物件方法 定義格式 def 例項方法名 self pass 呼叫格式 物件名.例項方法名 使用場景 在方法中需要self 物件 2 類方法 定義格式 classmethod def 類方法名 cls pass 呼叫格式 類名.類方法名 或者 物...