Найти - Пользователи
Полная версия: Перекрёстный импорт
Начало » Python для новичков » Перекрёстный импорт
1 2
Tropick
Доброго вечера!
Допустим есть 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. Посоветуйте как поступить
doza_and
Укажите питон который используете.
self.__dict__['owner'] = collectioner
self.owner = collectioner
одно и тоже.
у вас нет никакой необходимости в строках типа
from Car import *
if type(newOwner) != Collectioner:
проверка типа - архитектурный недостаток.
PanovSergey
Циклические импорты зобороть можно вынеся общий код в отдельный модуль. Если хотит чтобы была связь двусторонняя то все что относится к Колллеционеру в Авто и в Авто к Коллекционеру выделяте в отдельный класс.

Да и НИКОГДА не используйте wild import огребете с именами.
doza_and
PanovSergey
Циклические импорты зобороть
А можно и не бороть. Просто это некрасиво.
sergeek
нужно загружать так
import Car
и обращаться к классу через точку (не надо называть модуль с заглавной буквы)
Car.Car
doza_and
проверка типа - архитектурный недостаток
ну у него там исключение кидается, это нормально же
doza_and
Просто это некрасиво
Тоже не согласен. У ТСа может некрасиво, а так ок.

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

+ То что кода в модуле чуть меньше строки короче читать удобнее
- То что иногда в коде изредка не понятно что именно импортировано, но современные IDE выведут подсказку
sergeek
PanovSergey
from car import Car
ну так у ТСа все равно будет программа падать от рекурсивного импорта.
К минусам можно добавить еще то, что для больших модулей довольно таки часто приходится прыгать на эту строчку импорта и редактировать.
PanovSergey
sergeek
ну так у ТСа все равно будет программа падать от рекурсивного импорта.
Выше написано как победить.
sergeek
PanovSergey
Выше написано как победить.
PanovSergey
Циклические импорты зобороть можно вынеся общий код в отдельный модуль. Если хотит чтобы была связь двусторонняя то все что относится к Колллеционеру в Авто и в Авто к Коллекционеру выделяте в отдельный класс.
там общий код в методах, по-нормальному их никак не вынести в отдельный модуль
PanovSergey
там общий код в методах, по-нормальному их никак не вынести в отдельный модуль
Понятно что код кривой и не рабочий. Вынести значит собрать общий код вместе и выпилить оттуда где его не должно быть, унести в одельный модуль, поправить импорты, профит Стандартная задача.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB