MethodType动态绑定类方法问题

from types import MethodType


class Student(object):
    def __init__(self, *args, **kwargs):
        self.name = kwargs.pop('name')
        self.age = kwargs.pop('age')
        self.score = kwargs.pop('score')


def set_score(self, value):
    self.score = value


def get_score(self):
    return self.score


Student.set_score = MethodType(set_score, Student)
Student.get_score = MethodType(get_score, Student)
t = Student(name="Bryan", age=24, score=80)
# 输出80
print(t.score)
t.set_score(100)
# 输出100
print(t.get_score())
# 为什么这里还是输出80,而不是100?
print(t.score)
print(isinstance(Student, object)) #True

原因解析

Student.set_score = MethodType(set_score, Student)

姑且这么认为:MethodType是一个可调用对象用于将静态函数对象绑定到实例对象上成为实例方法,Student本身是类也可以认为是object基类的实例,所以Student实例的score属性并不影响另一个实例t的score属性。

#MethodType源码
class MethodType:
    __func__: _StaticFunctionType
    __self__: object
    __name__: str
    __qualname__: str
    def __init__(self, func: Callable[..., Any], obj: object) -> None: ...
    def __call__(self, *args: Any, **kwargs: Any) -> Any: ...

来源:廖雪峰老师的Python教程,评论第一条

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值