Python 对象的参数';s的父母';s函数
在“Dog”类中,如果我初始化为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
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