2017-10-16 1 views
1

Ich habe den Code:Methoden im interaktiven Modus der Konsole außer Kraft setzen?

class Product: 
    def __init__(self,name, price,discount): 
     self.name = name 
     self.price = price 
     self.discount = discount 

    def get_discount_amout(self): 
     return self.price * self.discount 

ich den Code zu IPython Konsole kopiert und eine Instanz erstellen:

In [2]: book = Product('Think Python', 12.99, 30) 

Berechnen Sie den Rabattbetrag

In [5]: book.get_discount_amout() 
Out[5]: 389.7 

ich die Rechtschreibfehler zu finden und arithmetischer Fehler, um sie sofort in der Konsole zu korrigieren. Zuerst definiere ich eine korrekte get_discount_amount Funktion.

def get_discount_amount_correct(self): 
    return self.price * self.discount/100 

Zweite book bisherige Methode zu überschreiben.

book.get_discount_amount = get_discount_amount_correct 

Testen Sie es.

In [13]: book.get_discount_amount 
Out[13]: <function __main__.get_discount_amount_correct> 

Fantastischen ... dann

In [14]: book.get_discount_amount() 
TypeError: get_discount_amount_correct() missing 1 required positional argument: 'self' 

Versuch,

In [15]: book.get_discount_amount(self) 
NameError: name 'self' is not defined 

alternativ versuchen lambda:

In [16]: book.get_discount_amount = lambda self: self.price * self.discount/100 
TypeError: <lambda>() missing 1 required positional argument: 'self' 

In-Konsole können die Objektattribute leicht überschrieben werden, Wie zu o seine Methoden schreiben?

+0

Sie müssen die korrigierten Methode zur Klasse ('-Produkt mit), nicht die Instanz hinzufügen ('Buch'). – jasonharper

+0

Es kann in script_mode.errors Berichte in der Konsole geändert werden, 'Product.get_discount_amount = get_discount_amount_correct',' In [26]: Product.get_discount_amount Out [26]: '@jasonharper –

Antwort

2

Option 1

Halten Sie das Verfahren zur Instanz ersetzt, nicht die Typ und übergeben book als self:

book.get_discount_amount(book) 

Option 2

Ersetzen Methode für die Typ:

Product.get_discount_amount = get_discount_amount_correct 

Und dann jedes neue Product Sie erstellen, wird das ersetzte Methode verwenden:

new_book = Product('New book', 20, 10) 
new_book.get_discount_amount() # prints 2 
Verwandte Themen