2015-02-21 3 views
0

Я знаю об этом question. Мина похожа, но не то же самое, потому что я переписываю указанный метод. И я не могу использовать @staticmethod, потому что мне нужно будет использовать его на self, а также в других функциях класса.Использовать метод класса A в классе B, где B перезаписывает этот метод

У меня есть class Player и class Dealer. В Player я определяю метод, называемый print_cards. В классе Dealer Я переписываю этот метод. Как я могу получить экземпляр Дилера для использования метода Playerprint_cards, а не его собственного?

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

d.Player.print_cards() # this is what I am thinking, but it is not valid python 

>>> I am in Player's class. 
>>> I am in Dealer's class. 
+0

Try 'Player.print_cards (d)'. – Matt

ответ

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

super работает по-разному для питона 2 и 3 В частности, обратите внимание на разницу в заявке def: Player класс:

class Player(object): 

, который известен как класс «нового стиля» в Python2. По умолчанию все классы в Python 3 являются классами нового стиля, если я правильно помню. Кроме того, обратите внимание, что super требует тип класса, который вы ищете для родителя, и self, который является связанным объектом, дочерним элементом родительского класса.

+0

Здесь вы должны выделить различия Python 2/3. – ely

+0

@ Mr.F Вопрос задан Python3. Я добавил различия, это правильно? (Как я уже сказал, я стараюсь избегать наследования) – ljetibo

+0

Да, хорошая работа. – ely

1

Вы можете вызвать метод экземпляра класса с другим именем. Например .:

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 
+0

Я буду использовать 'Player.print_cards (d)', так как мне нужно будет сделать это только один раз. Благодарю. – Vader

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) 
Смежные вопросы