2017-01-25 7 views
1

Imagine У меня есть следующий файл test.pyне удается получить доступ к функции Python как атрибут

import foo 

class example1(object): 
     MyFunc = foo.func 

Где foo.py является

def func(): 
     return 'Hi' 

Затем я пишу другой файл

import test 

test.example1.MyFunc() 

и получить сообщение об ошибке 'unbound method func() должен быть вызван с примером example1 в качестве первого аргумента (вместо этого ничего не получается)'.

Как использовать функцию func как атрибут класса example1?

+0

Указанная ошибка является специфичной для Python2. –

ответ

1

Это проблема Python2. Измените test.py на следующее и оно работает.

import foo 

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

Обратите внимание, что если вы держите test.py как вы показать, следующие работы:

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

Это связано с тем, как атрибуты функции получают доступ в Python. Посмотрите на descriptors, если вам интересно.

Адрес related question. И another one

Техническая сторона вопроса, разработаны here

0

Следующие работы для меня в Python 2.7:

Вы пропускаете __init__() метод в определении класса.

foo.py должен быть определен следующим образом:

def func(): 
     return 'Hi' 

Класс должен быть определен следующим образом:

import foo 

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

Затем, когда вы хотите вызвать атрибуты из класса, вы должны создать его экземпляр первым , Сценарий tester.py должен выглядеть так:

import tester 

testerInstance = tester.example1() 

testerAttribute = testerInstance.MyFunc() 
print testerAttribute 
2

Ваша проблема является специфической проблемой питон 2. Тип unbound method устарел на python 3. Итак, ваш код подходит для python 3. Вот хорошо просматриваемый ответ: What is the difference between a function, an unbound method and a bound method. При вызове несвязанного метода в python 2 потребуется экземпляр соответствующего типа класса.

Здесь есть некоторые решения. Другим является то, что вы можете определить свою функцию следующим образом:

def func(object): 
    return "Hi" 

Поскольку этот объект принимает первый аргумент. Теперь вы можете написать этот код:

test.example1().MyFunc()