2017-01-25 3 views
1

Stellen ich die folgende test.py DateiKein Zugriff auf Python Funktion als Attribut

import foo 

class example1(object): 
     MyFunc = foo.func 

Wo foo.py

def func(): 
     return 'Hi' 

Dann ist ich eine andere Datei schreiben

import test 

test.example1.MyFunc() 

und den Fehler 'ungebundene Methode erhalten func() muss mit example1-Instanz als erstes Argument aufgerufen werden (hat stattdessen nichts)'.

Wie kann ich die Funktion func als Attribut der Klasse example1 verwenden?

+0

Der obige Fehler ist Python2-spezifisch. –

Antwort

1

Dies ist ein Python2-Problem. Ändern Sie test.py in das folgende und es funktioniert.

import foo 

class example1(object): 
    MyFunc = staticmethod(foo.func) 

Beachten Sie, dass, wenn Sie test.py halten, wie Sie es zeigen, die folgenden Werke:

test.example1.__dict__['MyFunc']() 

Dies ist auf die Art und Weise zusammenhängt Funktion Attribute in Python zugegriffen werden. Schauen Sie sich descriptors an, wenn Sie neugierig sind.

Hier ist ein related question. Und another one

Die technischen Einzelheiten der Frage entwickelt sind here

0

Die folgenden Werke für mich in Python 2.7:

Sie vermissen eine __init__() Methode in der Klassendefinition.

foo.py wie folgt definiert werden:

def func(): 
     return 'Hi' 

Die Klasse definiert werden wie folgt:

import foo 

class example1(): 
    def __init__(self): 
     self.MyFunc = foo.func 

Dann, wenn Sie Attribute aus der Klasse aufgerufen werden soll, sollten Sie es zuerst instanziiert . Das tester.py-Skript sollte beispielsweise so aussehen:

import tester 

testerInstance = tester.example1() 

testerAttribute = testerInstance.MyFunc() 
print testerAttribute 
2

Ihr Problem ist ein Python-2-spezifisches Problem. Der Typ unbound method ist in Python 3 veraltet. Ihr Code ist also gut für Python 3. Hier ist eine gut angesehene Antwort auf: What is the difference between a function, an unbound method and a bound method. Der Aufruf einer ungebundenen Methode in Python 2 erfordert eine Instanz des entsprechenden Klassentyps.

Hier gibt es einige Lösungen. Eine andere ist, können Sie Ihre Funktion wie folgt definieren:

def func(object): 
    return "Hi" 

Da dies Objekt als sein erstes Argument nimmt. Jetzt können Sie diesen Code schreiben:

test.example1().MyFunc() 
Verwandte Themen