Python中方法也是属性

本文探讨了在Python类中定义的方法与函数的区别,解释了为何实例方法实际上是函数对象,以及如何动态添加方法到实例。通过具体示例,展示了绑定方法的过程及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象:

class Person(object):
    def __init__(self, name, grade):
        self.name = name
        self.grade = grade

    def get_grade(self):
        return 'A'

p1 = Person('Bob', 90)
print(p1.get_grade())

结果为: A
若最后一行为

print(p1.get_grade)

则输出为:

<bound method Person.get_grade of <main.Person object at
0x00000000029CEE48>>

也就是说,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)  #跟2版本相比变成两个参数,即去掉了后面的所属类参数
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


任务:
由于属性可以是普通的值对象,如 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())

结果为:

<function Person.init.. at 0x0000000002A16620>
A

分析:
直接把 lambda 函数赋值给 self.get_grade 和绑定方法有所不同,函数调用不需要传入 self,但是方法调用需要传入 self。


大家加油!
学习链接:https://www.imooc.com/code/6178

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值