5

w module a.pyPrzypisywanie metoda moduł do zmiennej klasy lub zmiennej instancji

def task(): 
    print "task called" 

a = task 

class A: 

    func = task    # this show error unbound method 
    #func = task.__call__ # if i replace with this work 

    def __init__(self): 
     self.func_1 = task 

    def test_1(self): 
     self.func_1() 

    @classmethod 
    def test(cls): 
     cls.func() 


a() 
A().test_1() 
A.test() 

wyjściowa:

task called 
task called 
Traceback (most recent call last): 
    File "a.py", line 26, in <module> 
    A.test() 
    File "a.py", line 21, in test 
    cls.func() 
TypeError: unbound method task() must be called with A instance as 
first argument (got nothing instead) 

W tym module można łatwo przypisać funkcję do zmienna. Kiedy wewnątrz klasy spróbuj przypisać funkcję poziomu modułu do zmiennej klasy func = zadanie pokazuje błąd, aby usunąć ten błąd muszę go zastąpić func = zadanie .__ call__ Ale kiedy przypisać do zmiennej instancji jego pracy siebie. func_1 = zadanie.

Moje pytanie brzmi: dlaczego nie mogę przypisać funkcji poziomu modułu do zmiennej klasy bez __call__ i gdy działa ta sama funkcja, którą mogę przypisać do zmiennej instancji.

+2

Dodatkowo, warto zauważyć, że kompiluje i działa zgodnie z oczekiwaniami w python 3.x (w szczególności 3.6). – Ori

Odpowiedz

1

Bo odwzorowane funkcję jako niezwiązanego metody A, więc kiedy dzwonisz cls.func najpierw zapytać coś równa getattr(cls, 'func') która zwraca <unbound method A.task> Ale to niezwiązany metoda musi być wywoływana z klasy jako pierwszy argument.

tak dlatego, że w tym konkretnym przypadku cls.func oznacza „daje mi atrybut class func z cls” nie może oznacza jednocześnie „call klasy metody func” - Więc Python nie przekłada cls.func() przez func(cls).

Ale w tym samym czasie, ponieważ func jest <unbound method A.task> (związany A.task) musi być wywołana jak func(cls) do pracy.

Sprawdź to z czymś takim:

@classmethod 
def test(cls): 
    print getattr(cls, 'func') # <unbound method A.task> 

Można go naprawić coś podobnego:

def task(cls=None): 
    if cls is None: 
     print 'task()' 
    else: 
     print 'A.foo({})'.format(cls) 

a = task 

class A: 
    func = task    # this show error unbound method 

    def __init__(self): 
     self.func_1 = task 

    def test_1(self): 
     self.func_1() 

    @classmethod 
    def test(cls): 
     cls.func(cls()) 

a() 
A().test_1() 
A.test() 

wyjściowa:

task() 
task() 
A.foo(<__main__.A instance at 0x7fd0310a46c8>) 

Zauważ, że python3 usuwa metod niezwiązanych ta działa tylko z python2.x

+0

co jest źródłem tego – Kallz

Powiązane problemy