Зависимость модуля Python

Боюсь, что ответ отрицательный. К тому времени, когда JavaScript был запущен на вашей странице, серверная часть (PHP) уже завершила обработку. Лучше всего выполнить то, что вам нужно до загрузки страницы, или выполнить ее только с помощью JavaScript.

16
задан Dlinet 25 October 2012 в 23:16
поделиться

5 ответов

Никакая потребность импортировать CRoom

Вы не используете CRoom в person.py, не импортируйте его. Из-за динамического связывания, Python не должен "видеть все определения классов во время компиляции".

, Если Вы на самом деле делаете использование CRoom в person.py, затем измените from room import CRoom на import room и используйте квалифицированную к модулю форму room.CRoom. См. Круговой Импорт Effbot для деталей.

Заметка на полях: у Вас, вероятно, есть ошибка в Self.NextId += 1 строка. Это увеличивает NextId из экземпляра, не NextId из класса. Увеличить встречное использование класса CRoom.NextId += 1 или Self.__class__.NextId += 1.

19
ответ дан Constantin 25 October 2012 в 23:16
поделиться

Необходимо ли на самом деле сослаться на классы во время определения класса? т.е.

 class CRoom(object):
     person = CPerson("a person")

Или (более вероятно), сделайте Вас, просто должен использовать CPerson в методах Вашего класса (и наоборот). например:

class CRoom(object):
    def getPerson(self): return CPerson("someone")

, Если второе, нет никакой проблемы - как, к тому времени, когда метод становится названным , а не определенный, модуль будет импортирован. Ваша единственная проблема состоит в том, как обратиться к ней. Вероятно, Вы делаете что-то как:

from CRoom import CPerson # or even import *

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

#croom.py
import cperson
class CRoom(object):
    def getPerson(self): return cperson.CPerson("someone")

Здесь, для Python не нужен к поиску атрибут на пространстве имен, пока метод на самом деле не называют, которым временем оба модуля должны были завершить свою инициализацию.

7
ответ дан Brian 25 October 2012 в 23:16
поделиться

Во-первых, именование Ваших споров с прописными буквами сбивает с толку. Так как Python не имеет формальной, статической проверки типа, мы используем UpperCase, чтобы означать класс и lowerCase означать аргумент.

1113-секундный, мы не беспокоимся CRoom и CPerson. Верхний регистр достаточен, чтобы указать, что это - класс. Буква C не используется. Room. Person.

В-третьих, мы обычно не помещаем вещи в [1 125] Один Класс На формат Файла . Файл является модулем Python, и мы чаще импортируем весь модуль со всеми классами и функциями.

[я знаю, что те - привычки - Вы не должны повреждать их сегодня, но из-за них действительно сложно читать.]

Python не использует статически определенные типы как C++. При определении функции метода Вы официально не определяете тип данных аргументов той функции. Вы просто перечисляете некоторые имена переменной. Хотелось бы надеяться, клиентский класс обеспечит аргументы корректного типа.

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

цикл между room.Room и person.Person является проблемой. Вы не должны включать тот при определении другого.

является самым безопасным импортировать весь модуль.

Вот room.py

import person
class Room( object ):
    def __init__( self ):
        self.nextId= 0
        self.people= {}
    def addPerson(self, firstName, secondName, gender):
        id= self.NextId
        self.nextId += 1

        thePerson = person.Person(firstName,secondName,gender,id)
        self.people[id] = thePerson
        return thePerson 

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

Человек не должен быть известен до времени выполнения, когда тогда Человек (...) выражение оценено.

Вот person.py

import room
class Person( object ):
    def something( self, x, y ):
        aRoom= room.Room( )
        aRoom.addPerson( self.firstName, self.lastName, self.gender )

Ваш main.py, похож на это

import room
import person
r = room.Room( ... )
r.addPerson( "some", "name", "M" )
print r
2
ответ дан S.Lott 25 October 2012 в 23:16
поделиться

Вы могли просто исказить второй.

import CRoom

CPerson = CRoom.CPerson
1
ответ дан Pang 25 October 2012 в 23:16
поделиться

@S.Lott, если я ничего не импортирую в модуль помещения, что я получаю неопределенную ошибку вместо этого (я импортировал его в основной модуль как Вы, показал)

Traceback (новый вызов в последний раз):
Файл "C:\Projects\python\test\main.py", строка 6, в
Ben = Комната. AddPerson ('Ben', 'Более черный', 'Штекерный')
Файл "C:\Projects\python\test\room.py", строка 12, в человеке AddPerson
= CPerson (FirstName, SecondName, Gender, Айдахо)
NameError: глобальное имя 'CPerson' не определяется

кроме того, причина там различные модули - то, где я встретился с проблемой запуститься с контейнерного класса (ieg, комната) уже несколько сотен строк, таким образом, я хотел объекты в нем (например, люди) в отдельном файле.

РЕДАКТИРОВАНИЕ: main.py

from room import CRoom
from person import CPerson

Room = CRoom()

Ben = Room.AddPerson('Ben', 'Blacker', 'Male')
Tom = Room.AddPerson('Tom', 'Smith',   'Male')

Ben.Leave()
0
ответ дан Fire Lancer 25 October 2012 в 23:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: