2016-06-28 3 views
3

Я совершенно новичок в концепции класса python. После поиска решения в течение нескольких дней, я надеюсь, что я получу помощь здесь:Использование импорта внутри класса

Я хочу класс python, где я импортирую функцию и использую ее там. Основной код должен иметь возможность вызывать функцию из класса. для этого у меня есть два файла в одной папке.


Благодаря @cdarke, @DeepSpace и @MosesKoledoye, я редактировал ошибку, но, к сожалению это не так.

я все еще получаю ошибку:

test 0 
Traceback (most recent call last): 
    File "run.py", line 3, in <module> 
    foo.doit() 
    File "/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py", line 8, in doit 
    self.timer(5) 
    File "/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py", line 6, in timer 
    zeit.sleep(2) 
NameError: global name 'zeit' is not defined 


@wombatz получил правильный совет: он должен быть self.zeit.sleep (2) или Test.zeit.sleep (2). импорт может быть также выполнен над объявлением класса.


Test.Py

class Test: 
    import time as zeit 
    def timer(self, count): 
     for i in range(count): 
      print("test "+str(i)) 
      self.zeit.sleep(2)  <-- self is importent, otherwise, move the import above the class declaration 
    def doit(self): 
     self.timer(5) 

и

run.py

from test import Test 
foo = Test() 
foo.doit() 

когда я пытаюсь python run.py я получаю эту ошибку:

test 0 
Traceback (most recent call last): 
    File "run.py", line 3, in <module> 
    foo.doit() 
    File "/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py", line 8, in doit 
    self.timer(5) 
    File "/Users/ls/Documents/Entwicklung/RaspberryPi/test/test.py", line 6, in timer 
    sleep(2) 
NameError: global name 'sleep' is not defined 

Из-за ошибки я понимаю, что импорт в классе не распознается. Но как я могу добиться того, что импорт в классе признан?

+0

Возможно, вы имеете в виду 'zeit.sleep (2)' – cdarke

+0

@cdarke на самом деле 'zeit.sleep', поскольку OP использует' as' – DeepSpace

+0

@DeepSpace: мое редактирование перечеркнуто над вашим комментарием. Спасибо – cdarke

ответ

4

Все, что определено в пространстве имен класса, должно быть доступно из этого класса. Это относится к методам, переменным, вложенным классам и всему остальному, включая модули.

Если вы действительно хотите импортировать модуль внутри класса вы должны получить доступ к нему из этого класса:

class Test: 
    import time as zeit 
    def timer(self): 
     self.zeit.sleep(2) 
     # or Test.zeit.sleep(2) 

Но почему бы вам импортировать модуль внутри класса так или иначе? Я не могу придумать пример использования, несмотря на то, что он не захотел вставить это пространство имен.

Вам действительно нужно переместить импорт в верхнюю часть модуля. Затем вы можете позвонить zeit.sleep(2) внутри класса без префикса self или Test.

Также вы не должны использовать неанглийские идентификаторы, такие как zeit. Люди, которые говорят по-английски, могут читать ваш код.

+0

@syntonym Извините, я не совсем понимаю. Не могли бы вы показать мне пример? – Wombatz

+0

Извините, я думаю, что вас неправильно понял. Я думал, вы имели в виду, что вам всегда нужно использовать 'self.attribute' в классе, что, конечно же, неверно, потому что вы можете использовать такие вещи, как глобальные или встроенные (например, печать). Но вы имели в виду, что объекты, определенные в пространстве имен класса, автоматически недоступны из функций, связанных с классом. – syntonym

+0

@syntonym Да, я должен уточнить это, спасибо за подсказку. – Wombatz

3

sleep не является встроенным python, а имя как есть, не ссылается ни на какой объект. Таким образом, Python правильно поднял номер NameEror.

Вы намерены:

import time as zeit 

zeit.sleep(2) 

И двигаться import time as zeit в верхней части модуля.

Модуль time с псевдонимом как zeit, вероятно, не отображается в глобальной таблице символов вашего модуля, потому что он был импортирован внутри class.

+0

спасибо, я исправил ошибку, но я не помог - см. Мое редактирование. – ludwigschuster

+1

@ludwigschuster см. Мое обновление: переместите 'import time as zeit' в начало модуля. –

2

Вы почти у цели! sleep - это функция в модуле time. Это означает, что имя sleep не существует, если оно не понимается в контексте time, если вы не определяете его самостоятельно. Поскольку вы не определили его самостоятельно, вы можете получить к нему доступ, запустив time.sleep(2).

В вашем конкретном примере, вы использовали:

import time as zeit 

вам придется работать:

zeit.sleep(2) 

В качестве альтернативы, вы можете импортировать сон непосредственно от времени, запустив:

from time import sleep 
sleep(2) 

Удачи!

Вы можете прочитать больше о время модуле здесь: https://docs.python.org/2/library/time.html

Вы можете узнать больше о импорте здесь: https://docs.python.org/3/reference/import.html

и я настоятельно рекомендую узнать о пространстве имен в питоне, здесь: https://bytebaker.com/2008/07/30/python-namespaces/

+0

спасибо, я исправил ошибку, но я не помог - см. Мое редактирование. – ludwigschuster

+0

переместите оператор импорта над определением класса. 'import time as zeit' должен быть выше строки' class Test: '. – AbrahamB

+0

@ludwigschuster, вы смогли попробовать это? – AbrahamB

3

You хочу time.sleep. Вы также можете использовать;

from time import sleep 

Редактировать: Импортировано в пределах класса вопросов проблемы объяснены here.

+0

спасибо, я исправил ошибку, но я не помог - см. Мое редактирование. – ludwigschuster

+0

@ludwigschuster Вы должны прочитать ответ, связанный здесь. Нет причин для импорта в вашем классе. Он должен находиться в верхней части вашего модуля.(Примечание. Есть исключения из этого для модулей, для которых требуется специальная инициализация перед импортом, но это редко и, безусловно, не относится к модулю 'time'). – skrrgwasme

Смежные вопросы