Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 4, 2014 15:49:32

Tropick
Зарегистрирован: 2014-01-31
Сообщения: 7
Репутация: +  0  -
Профиль   Отправить e-mail  

Перекрёстный импорт

Доброго вечера!
Допустим есть 2 класса:
-класс коллекционер
-класс машина
Коллекционер может иметь много машин, машина имеет только одного коллекционера.
Прошу простить, если “это” больно читать.
Коллекционер:

from Car import *
from Exceptions import *


class Collectioner(object):
def __init__(self, name, car=None):
self.__dict__['cars'] = [car]
self.__dict__['name'] = name

def addCar(self, car):
if type(car) != Car:
raise SomeException()
if car.owner != self:
raise SomeException()
self.__dict__['cars'].append(car)

def removeCar(self, oldCar):
if type(oldCar) != Car:
raise SomeException
if oldCar.owner == self:
oldCar.changeOwner(None)
self.__dict__['cars'].remove(oldCar)
машина:
from Collectioner import * 
from Exceptions import *

class Car(object):
def __init__(self,collectioner,model):
if type(collectioner) == Collectioner:
self.__dict__['owner'] = collectioner
self.__dict__['model'] = model

@property
def owner(self):
return self.__dict__['owner']


def changeOwner(self, newOwner):
if newOwner == None:
self.__del__(self)
return
if type(newOwner) != Collectioner:
raise SomeException()
self.__dict__['owner'] = newOwner

Ругается на якобы глобальную Collectioner и Car. Посоветуйте как поступить

Отредактировано Tropick (Фев. 4, 2014 15:52:50)

Офлайн

#2 Фев. 4, 2014 17:55:45

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Перекрёстный импорт

Укажите питон который используете.

self.__dict__['owner'] = collectioner
self.owner = collectioner
одно и тоже.
у вас нет никакой необходимости в строках типа
from Car import *
if type(newOwner) != Collectioner:
проверка типа - архитектурный недостаток.



Офлайн

#3 Фев. 4, 2014 18:15:05

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Перекрёстный импорт

Циклические импорты зобороть можно вынеся общий код в отдельный модуль. Если хотит чтобы была связь двусторонняя то все что относится к Колллеционеру в Авто и в Авто к Коллекционеру выделяте в отдельный класс.

Да и НИКОГДА не используйте wild import огребете с именами.

Офлайн

#4 Фев. 4, 2014 18:18:30

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Перекрёстный импорт

PanovSergey
Циклические импорты зобороть
А можно и не бороть. Просто это некрасиво.



Офлайн

#5 Фев. 4, 2014 19:05:59

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Перекрёстный импорт

нужно загружать так

import Car
и обращаться к классу через точку (не надо называть модуль с заглавной буквы)
Car.Car
doza_and
проверка типа - архитектурный недостаток
ну у него там исключение кидается, это нормально же
doza_and
Просто это некрасиво
Тоже не согласен. У ТСа может некрасиво, а так ок.

Отредактировано sergeek (Фев. 4, 2014 19:06:30)

Офлайн

#6 Фев. 4, 2014 19:14:38

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Перекрёстный импорт

нужно загружать так
import Car
и обращаться к классу через точку (не надо называть модуль с заглавной буквы)
Car.Car
По мне так
from car import Car

+ То что кода в модуле чуть меньше строки короче читать удобнее
- То что иногда в коде изредка не понятно что именно импортировано, но современные IDE выведут подсказку

Отредактировано PanovSergey (Фев. 4, 2014 19:15:02)

Офлайн

#7 Фев. 4, 2014 19:27:28

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Перекрёстный импорт

PanovSergey
from car import Car
ну так у ТСа все равно будет программа падать от рекурсивного импорта.
К минусам можно добавить еще то, что для больших модулей довольно таки часто приходится прыгать на эту строчку импорта и редактировать.

Отредактировано sergeek (Фев. 4, 2014 19:28:10)

Офлайн

#8 Фев. 4, 2014 19:33:37

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Перекрёстный импорт

sergeek
ну так у ТСа все равно будет программа падать от рекурсивного импорта.
Выше написано как победить.

Офлайн

#9 Фев. 4, 2014 19:36:24

sergeek
Зарегистрирован: 2012-06-26
Сообщения: 470
Репутация: +  43  -
Профиль   Отправить e-mail  

Перекрёстный импорт

PanovSergey
Выше написано как победить.
PanovSergey
Циклические импорты зобороть можно вынеся общий код в отдельный модуль. Если хотит чтобы была связь двусторонняя то все что относится к Колллеционеру в Авто и в Авто к Коллекционеру выделяте в отдельный класс.
там общий код в методах, по-нормальному их никак не вынести в отдельный модуль

Офлайн

#10 Фев. 4, 2014 19:44:00

PanovSergey
От: Екатеринбург
Зарегистрирован: 2013-12-29
Сообщения: 269
Репутация: +  19  -
Профиль   Адрес электронной почты  

Перекрёстный импорт

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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version