python - python 中的方法与类相关联。与实例直接关联的函数意味着什么?

标签 python python-3.x function class self

我知道在Python中,方法与类相关联,而不是与实例相关联,但它们接受实例作为第一个参数以便访问它。但是,我们仍然可以定义一个函数并将其直接绑定(bind)到一个实例。这意味着什么?这个函数可以以某种方式访问​​实例吗?

class TestClass:
    def __init__(self, a):
       self.a = a

    def method1(self):
        return self.a

my_obj = TestClass(12)

print(my_obj.method1()) // 12

Python 也允许这样做:

class TestClass:
    def __init__(self, a):
       self.a = a
my_obj = TestClass(12)

def method1_defined_outside(self):
    return self.a

TestClass.method1 = method1_defined_outside

print(my_obj.method1()) // 12

上面两个片段的意思是一样的。 但Python也允许这样:

class TestCase:
    def __init__(self, a):
       self.a = a
my_obj = TestCase(12)

def method1_defined_outside(self):
    return self.a

my_obj.method1 = method1_defined_outside

print(my_obj.method1()) // this throws an error stating the method1 is missing one postional argument(s), so clearly self does not automatically equate to the object

第二个和第三个代码片段之间的区别在于,外部定义的方法与后者的实例相关,而与前者的类相关。

最佳答案

当您通过实例访问方法,但该方法存在于类中时,访问该方法实际上会创建一个方法包装器。该包装器知道调用该方法的实例,并将其作为第一个参数传递给实际函数(按照惯例,命名为 self)。这背后的机制是 descriptor protocol这也是属性的运作方式。

当您将方法直接放在实例上时,这些都不适用,它只是您通过实例访问的函数。它没有得到self

现在,您可以通过手动调用描述符来创建方法包装器,并在实例上设置生成的绑定(bind)方法。

my_obj.method1 = method1_defined_outside.__get__(my_obj)

现在 my_obj.method1()my_obj 作为 self 传递。

不过,您想要在这样的实例上设置方法的情况相当罕见。

关于python - python 中的方法与类相关联。与实例直接关联的函数意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55855882/

相关文章:

python - 在python中创建使用**(双星)语法的对象时如何传递额外的参数?

python - 忽略在 python 3 中向调用者引发异常

python - 使用错误 : Line magic function `%sql` not found

python - 如何在正则表达式中隐藏匹配之后和关键字之前的文本?

python - 在跳过第一行并使用第二行作为 pandas 中符号的原始刻度数据的标题时,无法读取 csv

php - 2个返回在一个函数中

sql-server - "Adding a value to a ' 日期时间 ' column caused an overflow."

python - 统计模型 : simulate data and run simple linear regression

mysql - 您可以使用 MySQLdb 的同一连接执行多个原子提交吗

php - 需要根据给定的句子创建一个随机句子