2012-04-08 5 views
1

Ich versuche verschiedene Dinge zu verstehen, Dekoratoren und Funktionen in Python. Ist der Code unten richtige Art und Weise:Gebundene Funktionen und Dekoratoren in Python

import math 
def calculate_area(func): 
    def area(a,b): 
     return a+b 
    return area 

class Donut(): 
    def __init__(self, outer, inner): 
     self.inner = inner 
     self.outer = outer 

    @calculate_area 
    @staticmethod 
    def area(self): 
     outer, inner = self.radius, self.inner 
     return Circle(outer).area() - Circle(inner).area() 

Will „staticmenthod“ Dekorateur der eingebaute Typ (die Klasse einer Klasse, siehe diese Frage) default metaclass Tells nicht gebundene Methoden zu erstellen? ist es möglich, zu tun:

Donut.area(4,5) 
Traceback (most recent call last): 
File "<pyshell#33>", line 1, in <module> 
Donut.area(4,5) 
TypeError: unbound method area() must be called with Donut instance as first argument  (got int instance instead) 

Bitte helfen Sie mir zu verstehen gebunden Methoden und ungebundene Methoden und was es die Auswirkungen des Dekorateur auf sich.

Antwort

2

tauschen nur die @staticmethod mit Ihrem Dekorateur

import math 
def calculate_area(func): 
    def _area(a, b): 
     return a + b 
    return _area 

class Donut(): 
    def __init__(self, outer, inner): 
     self.inner = inner 
     self.outer = outer 

    @staticmethod 
    @calculate_area 
    def area(cls): 
     outer, inner = self.radius, self.inner 
     return "" 

EDIT 1:

Python-Interpreter an, bevor eine andere Dekorateure hinzufügen @staticmethod erfordert, weil, bevor eine Klasse-Typ, dessen Notwendigkeit Ermittelt die Schaffung Die Klassenmitglieder und Instanzmitglieder. Wenn Ihr erster Dekorator etwas anderes ist, hat der Interpreter diese Funktion als Instanzmitglied erkannt. siehe this

EDIT 2:

es empfohlen wird die Verwendung @classmethod statt @staticmethod, für weitere Informationen siehe this

+2

Eine Erklärung, warum dies funktioniert und Code des OP ist nicht schön. – delnan

+0

gerade bearbeitet, siehe Edits – pylover

+0

Danke für die Antwort und mich verstehen zu lassen. Ich habe nur 1 Frage: bedeutet _ in _area() etwas bestimmtes? –

Verwandte Themen