Discuss / Python / 为什么通过动态绑定类的实例方法,不能访问实例属性?

为什么通过动态绑定类的实例方法,不能访问实例属性?

Topic source
from types import MethodType


class Student(object):

    def __init__(self,name):

        self.name = name


def get_name(self):

    return self.name


Student.get_name = MethodType(get_name,Student)



b = Student("Bryan")


# 这句话会报错 AttributeError,Student object has no attribute "name"
print(b.get_name())

你的get方法缩进不对. 它不是类里面定义的方法

from types import MethodType


class Student(object):

    def __init__(self,name):
        self.name = name


def get_name(self):
    return self.name


s = Student('Jenny')
# 绑定一个类属性,实例绑定
Student.get_name = MethodType(get_name, s)

b = Student("Bryan")

print(b.get_name())

应该是这样吧,必须使用实例绑定,但是绑定了一个类属性,所以b获取到的还是Jenny

正确的用法是:

类属性使用类绑定

Student.get_name = get_name

实例属性使用实例绑定

def get_name(self):
    return self.name

s = Student('Jenny')

s.get_name = MethodType(get_name, s)

要注意的是:

实例绑定只针对当前的对象(s)有效,而类绑定则相反


  • 1

Reply