gpt4 book ai didi

python - 对象的父函数的参数

转载 作者:行者123 更新时间:2023-11-28 16:33:01 24 4
gpt4 key购买 nike

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

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()

一切都很好。

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

Pet.print_func = print_fun

即,

class Dog(Pet):

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


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

当我这样做的时候

j.print_name()

我收到这个错误

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

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

最佳答案

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

从某种意义上说,绑定(bind)方法有点特殊,它们总是需要 self 参数,而函数则不需要。它们也不存在于实例 __dict__ 中 - 这正是发生的情况:您没有将其分配给 self.__dict__,而是分配给 Pet.__dict__ ,因此 Python 隐式地 self

换句话说,设置Pet.print_func创建一个方法,而self.print_func创建一个函数。

原因是您没有调用 Pet 构造函数 - Pet.print_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'):

test

进一步探索,该行为变得更具预测性。可以这样总结:如果你给一个类添加一个属性,它就被当作一个方法来对待。将属性添加到实例会使它成为一个函数(或局部属性)。进一步的例子

class Dog(Pet):

def __init__(self, name, print_func):
Pet.name = name
super(Dog, self).__dict__['print_func'] = print_func

输出(给定名称='test')

test

希望解释得足够好。

关于python - 对象的父函数的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30064660/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com