Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 30, 2007 20:17:48

offline
От:
Зарегистрирован: 2007-04-24
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вызвать class?

Не могу понять как в питоне работают с классами. Для примера есть файл /home/user/class.py в котором описан класс

class MyClass:
"A simple example class"
i = 12345
def f(self):
return 'hello world'
Теперь я хочу из другого файла ( /home/user/script.py ) воспользоваться этим классом и вызвать функцию f().

Знакомые говорят что надо прописывать папку /home/user в path и делать import. Так ли это? Получается немного не удобно.. Может есть другие способы?



Офлайн

#2 Авг. 30, 2007 20:32:27

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Как вызвать class?

offline
Теперь я хочу из другого файла ( /home/user/script.py ) воспользоваться этим классом и вызвать функцию f().
class - плохое название для файла. переименуй хотя бы в my_class.py. Потом, если файл лежит в тоже директории что и вызвающий скрипт, то пишешь просто
import my_class

mc = my_class.MyClass()
mc.f()
offline
Знакомые говорят что надо прописывать папку /home/user в path и делать import.
правду говорят, чтобы питон “видил” модули директории с ними должны быть прописаны в $PYTHON_PATH переменной окружения. Или в самом скрипте можно динамически добавлять:
import sys

sys.path.append( "/path/to/my/module/directory/" )
#тут уже можно импортировать модули из "/path/to/my/module/directory/"



Офлайн

#3 Авг. 30, 2007 20:39:57

j2a
От:
Зарегистрирован: 2006-06-29
Сообщения: 869
Репутация: +  1  -
Профиль   Отправить e-mail  

Как вызвать class?

1) class.py – плохое имя. Не называй свои модули/пакеты именами встроенных конструкций языка и/или пакетами стандартных пакетов
2) читай документацию (~1 ~2) или книги (~1, ~2, ~3)
3)

#!/usr/bin/env python
# /home/user/py/foo.py
class Foo(object):
“”“An example”“”
num = 1234
def meth(self, name='world'):
return 'Hello %s!" % name

#!/usr/bin/env python
# /home/user/py/script.py
from foo import Foo
f = Foo()
print “Foo class: %r” % Foo
print “Foo instance: %r” % f
print “f's class attribute: %r” % f.num
print “f's method: %r” % f.meth('Mike')



Отредактировано (Авг. 30, 2007 20:40:27)

Офлайн

#4 Авг. 30, 2007 21:13:45

offline
От:
Зарегистрирован: 2007-04-24
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вызвать class?

Большое спасибо, насчёт названий скриптов понял.
Вариант j2a очень порадовал, всё таки не надо добавлять путь в path. Но тут же появился другой вопрос, а что за “object” появился в параметрах класса Foo? И почему без этого слова не импортируется класс?

И второй вопрос. А если файлы находятся в разных папках, например foo.py теперь лежит в subdirectory с именем “something”. Уже никак без добавления в path не обойтись?



Офлайн

#5 Авг. 30, 2007 21:25:14

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Как вызвать class?

offline
Но тут же появился другой вопрос, а что за “object” появился в параметрах класса Foo? И почему без этого слова не импортируется класс?
Импортируется и так. Просто оbject это базавый класс для new-style классов в python. На ранних этапах работы с питон об этом можно не задумываться.
offline
И второй вопрос. А если файлы находятся в разных папках, например foo.py теперь лежит в subdirectory с именем “something”. Уже никак без добавления в path не обойтись?
если в подкаталоге, то ничего не надо добалять просто импорт меняется
import something.foo



Офлайн

#6 Авг. 30, 2007 21:57:21

offline
От:
Зарегистрирован: 2007-04-24
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вызвать class?

[offline@jobber new]$ ls
foo.py script.py

[offline@jobber new]$ python script.py
Traceback (most recent call last):
File "script.py", line 1, in ?
import foo
File "/home/offline/pylons/new/foo.py", line 1
class Foo():
^
SyntaxError: invalid syntax
как видно из ошибки, не позволяет импортировать класс без “object”. Версия питона у меня python-2.4.4.

Насчёт subdirectory тоже не получлось, пишет
[offline@jobber new]$ ls
script.py something

[offline@jobber new]$ python script.py
Traceback (most recent call last):
File "script.py", line 1, in ?
import something.foo
ImportError: No module named something.foo



Офлайн

#7 Авг. 30, 2007 22:04:07

player
От:
Зарегистрирован: 2007-08-09
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вызвать class?

лично я привык писать вот так:
class Foo:
то-есть без скобок возле имени класса.

Насчёт subdirectory - попробуй добавить файл __init__.py в subdirectory.
У меня всё получилось %)



Офлайн

#8 Авг. 30, 2007 22:26:07

offline
От:
Зарегистрирован: 2007-04-24
Сообщения: 121
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вызвать class?

player
Точно, все два твои способа помогли! Большое спасибо! А вверх по директориям никак нельзя? Только в subdirectories?



Офлайн

#9 Авг. 30, 2007 23:52:43

player
От:
Зарегистрирован: 2007-08-09
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Как вызвать class?

практически есть 2 способа:

import sys
sys.path.append( "/path/to/my/module/directory/" )
import os
BASE_DIR = "required path"
os.chdir(BASE_DIR)
Если нужно просто импортировать модуль (файл) то я рекомендую первый вариант.
Если необходимо чтобы вся логика исполнения скрипта начиналась с нужного пути - тогда второй.



Офлайн

#10 Авг. 31, 2007 02:11:43

Александр Кошелев
От: Москва
Зарегистрирован: 2007-02-03
Сообщения: 1724
Репутация: +  2  -
Профиль   Отправить e-mail  

Как вызвать class?

offline
как видно из ошибки, не позволяет импортировать класс без “object”.
скобки не надо писать



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version