<绑定方法 Class.fn> 与<绑定方法 fn>


def print_a(cls):
print(cls.a)
class Printer(): 
def __init__(self):
self.a = 2
self.b = 4
Printer.print_a = print_a
def print_b(self):
print(self.b)
>> p = Printer()
>> print(p.print_a)
<bound method print_a of <__main__.Printer object at 0x000002D92C2D0288>>
>> print(p.print_b)
<bound method Printer.print_b of <__main__.Printer object at 0x000002D92C2D0288>>

两者有什么区别?我知道print_b致力于Printer,而print_a是一个独立的功能 - 我的问题涉及两者之间的任何行为差异。目标是将不同模块中声明的方法分配给单个类,然后继承该类(未显示( - 这完成了吗?

(有关更多上下文,请参阅此处;以上是对我在那里的方法的改进。

目标是将不同模块中声明的方法分配给单个类,然后继承该类(未显示( - 这完成了吗?

确实如此;但是,您可以为类的每个实例化重复赋值,这是不必要的,并且不会反映您的意图。(这也意味着在第一次实例化之前,你不能对Printer.print_a做任何事情;这可能与你无关,但这是一个不必要的限制。最好只在类中执行此操作:

class Printer: 
def __init__(self):
self.a = 2
self.b = 4
def print_b(self):
print(self.b)
# This seems like it should do nothing, but works because of
# how the Python scoping rules work.
print_a = print_a

代码在功能上应该与您正常定义方法相同 - 它将以相同的方式通过相同的查找过程找到。但是,我宁愿将参数命名为self(因为该参数确实将接收一个实例,而不是类对象本身(。它在调试print中看起来不同的原因是,函数的这种表示依赖于其__qualname__属性,该属性是在首次创建函数对象时设置的(不依赖于引用或访问它的位置(。

最新更新