Python 对象的参数';s的父母';s函数

Python 对象的参数';s的父母';s函数,python,Python,在“Dog”类中,如果我初始化为 self.print_func = print_func 如下所示 class Pet(object): def __init__(self, name, print_func): self.name = name self.print_func = print_func class Dog(Pet): def __init__(self, name, print_func): Pet.na

在“Dog”类中,如果我初始化为

self.print_func = print_func
如下所示

class Pet(object):

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

class Dog(Pet):

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


    def print_name(self):
        self.print_func(self.name)

def print_string(str):
print str
当我这样做的时候

j.print_name()
j.print_name()
一切都很好

但是如果我将Dog类初始化为

Pet.print_func = print_fun
i、 e

当我这样做的时候

j.print_name()
j.print_name()
我得到这个错误

TypeError: print_string() takes exactly 1 argument (2 given)

那么,为什么在第二种情况下调用self.print_func会传递“self”参数,而在第一种情况下不会传递?

这是因为在
self
的情况下,您创建的是所谓的未绑定函数,在第二种情况下是绑定函数。绑定函数有效地转换为
Dog.print\u func(self,self.name)

绑定方法有点特殊,因为它们总是需要自参数,而函数不需要。它们也不存在于实例
\uuuuu dict\uuuu
中,这正是发生的情况:您没有将其分配给
self.\uuuu dict\uuuu
,而是分配给
Pet.\uuu dict\uuuuuu
,因此Python隐式地将其分配给
self

换句话说,设置
Pet.print\u func
创建一个方法,而
self.print\u func
创建一个函数

原因是您没有调用
Pet
constructor-
Pet.print\u func
修改方法的父列表。小小的修改使这一点更加清楚:

    class Dog(Pet):

    def __init__(self, name, print_func):
        Pet.name = name
        super(Dog, self).print_func = print_func
输出

AttributeError: 'super' object has no attribute 'print_func'
属性(或方法)甚至不存在!但是,如果调用构造函数

class Dog(Pet):

    def __init__(self, name, print_func):
        super(Dog, self).__init__(name, print_func)
您再次为函数赋值。输出(给定名称='test'):

进一步探索,这种行为变得更具预测性。可以这样概括:如果向类添加属性,它将被视为方法。将属性添加到实例后,它将保留为函数(或局部属性)。进一步的例子

class Dog(Pet):

    def __init__(self, name, print_func):
        Pet.name = name
        super(Dog, self).__dict__['print_func'] = print_func
输出(给定名称=“测试”)

希望能解释得足够好

test