使用B类中的A类方法,其中B覆盖此方法

时间:2015-02-21 16:09:15

标签: python oop python-3.x

我知道这 question 。我很相似,但不一样,因为我覆盖了所说的方法。我无法使用@staticmethod,因为我需要在self以及该类的其他函数中使用它。

我有class Playerclass Dealer。在Player中,我定义了一个名为print_cards的方法。在课程Dealer中,我覆盖了这个方法。如何让经销商实例使用Player的{​​{1}}方法而不是自己的?

print_cards

3 个答案:

答案 0 :(得分:3)

你的意思是这样的?没有super(),你没有完全覆盖父方法,只需重新定义它。 (但不确定,如果可以,我会尽量避免继承。)

class Player():
    def print_cards(self):
        print('I am in Player\'s class.')

class Dealer(Player):
    def print_cards(self):
        print('I am in Dealer\'s class.')
    def print_player(self):
        super().print_cards()

p = Player()
d = Dealer()

p.print_cards()
d.print_cards()
d.print_player()

输出是:

I am in Player's class.
I am in Dealer's class.
I am in Player's class.

虽然指定为Python 3问题,但这是你在Python 2中的表现方式

class Player(object):
    def print_cards(self):
        print('I am in Player\'s class.')

class Dealer(Player):
    def print_cards(self):
        print('I am in Dealer\'s class.')
    def print_player(self):
        super(Dealer, self).print_cards()
对于python 2和3, super以不同的方式工作。特别注意def类的Player语句的区别:

 class Player(object):

在Python2中被称为“新式”类。默认情况下,如果我没记错的话,Python 3中的所有类都是新式的类。另请注意,super需要一种您正在寻找父类的类,以及一个self,它是一个绑定对象,是父类的子类。

答案 1 :(得分:1)

您可以使用另一个self调用类的实例方法。 E.g:

class Player():
    def print_cards(self):
        print('I am in Player\'s class.')

class Dealer(Player):
    def print_cards(self):
        print('I am in Dealer\'s class.')

p = Player()
d = Dealer()

p.print_cards()
d.print_cards()

Player.print_cards(d)  # Not an instance

输出:

I am in Player's class
I am in Dealer's class
I am in Player's class

在这种情况下,这不是很有用。另一个例子:

class Being:
    def __init__(self):
        self.saying = "Patience is a virtue."
        self.home = "Earth"

    def say_virtue(self):
        print(self.saying)

    def say_home(self):
        print(self.home)

class Yoda:
    def __init__(self):
        self.saying = "Is patience virtue a."
        self.home = "Far galaxy away far."

    def say_virtue(self):
        print("Mean you 'Virtue say'?")

yoda = Yoda()
being = Being()

being.say_virtue()  # Says beings virtue
yoda.say_virtue()   # Says yodas virtue
Being.say_virtue(yoda)   # says Beings virtue with yodas `self.virtue`
# And as a side note:
print(yoda.say_home == being.say_home)  # Instances
print(Yoda.say_home == Being.say_home)  # Classes

## Prints:
Patience is a virtue.
Mean you 'Virtue say'?
Is patience virtue a.
False
True

答案 2 :(得分:1)

通常有人说可以使用super().method(self)调用超类中的方法,这不完全是事实。

super通常不是正确的做法,因为它不会调用超类中的方法,而是当前对象的类型方法解析顺序中的下一个类型的方法。 在多重继承的情况下,它可以调用您没有预料到的类中的方法:

class A(object):
    def say(self):
        print("I am A, just sayin'")

class B(A):
    def say(self):
        print("This is B, I let A speak for me")
        super().say()

B.say()来电A.say(),对吧?

错了,因为我们还有:

class C(A):
    def say(self):
        print("Hey it is me C")

class D(B, C):
    pass

现在我们创建一个D的实例,并在其上调用say()

D().say()

输出结果为:

This is B, I let A speak for me
Hey it is me C

也就是说,super()B.say的执行委托给C完全不知道的B类,而B既不是C子类或super()的超类。 next_type用词不当;它应该被称为super或其他东西。因此,如果您知道要传递给哪个类,请不要使用class B(A): def say(self): print("This is B, I let A speak for me") A.say(self) ,而是明确调用该方法:

{{1}}