通过实例级别的属性重写方法

问题描述 投票:0回答:1

这与这个问题有关,但是那里描述的方法不起作用。

我有一个特定的类

Dog
,带有方法
woofwoof
和属性
woof
。还有第二种方法
bark
,它返回
woofwoof()
对于给定的
Dog
实例,我想重新定义
bark
,以便它返回
woof
的值。
重要的是,
bark
必须保留一个方法,因为下游代码依赖于调用
bark

请参阅下面的最小工作示例。

class Dog:
    woof = 'woof'
    def woofwoof(self):
        return 'woof woof'
    def woOof(self):
        return 'woOof'
    def bark(self):
        return self.woofwoof()

def test(foo):
    print(type(foo.bark))
    print(foo.bark())

foo = Dog()
test(foo)

foo.bark = foo.woOof
test(foo)

foo.bark = foo.woof
test(foo)

上面的代码产生:

<class 'method'>
woof woof

<class 'method'>
woOof

<class 'str'>
TypeError: 'str' object is not callable

但是我想要最后两行的输出是:

<class 'method'>
woof

那就是保留

bark
的类型作为方法,但让它返回属性
woof
的值(特别是这样,如果我稍后更改
woof
的值,
bark
将返回更新后的值)打电话)。

python class methods attributes
1个回答
0
投票

定义一个返回

self.woof
的方法,并将其分配给
foo.bark

class Dog:
    woof = 'woof'
    def woofwoof(self):
        return 'woof woof'
    def woOof(self):
        return 'woOof'
    def bark(self):
        return self.woofwoof()
    def returnWoof(self):
        return self.woof

foo = Dog()
foo.bark = foo.returnWoof
test(foo)
© www.soinside.com 2019 - 2024. All rights reserved.