Можно ли создать совершенно новый экземпляр членов родительского класса? - PullRequest
2 голосов
/ 19 декабря 2011

Python версия 2.7.

Сценарий

class A(object):
    x = 0

class B(A):
    pass

ai = A()
bi = B()

#Then:
id(ai.x) == id(bi.x)
>>> True

Я хотел бы знать, есть ли способ, кроме наличия всех определений членов класса в __init__, чтобы иметь экземпляры class B, имеющие свои собственные копии x, без необходимости переопределять их в class B? Возможно, некоторые type() трюки?

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

редактировать: грамматики

edit2 Чтобы уточнить, я не использовал лучший пример.

class Y(object):
    def __init__(self):
         self.z = 0

class A(object):
    x = Y()

class B(A):
    pass

ai = A()
bi = B()

id(ai.x) == id(bi.x)
>>> True
ai.x.z = 3
id(ai.x) == id(bi.x)
>>> True

Теперь возникает проблема, так как я не переназначаю x в class B, они оба указывают на один и тот же экземпляр class Y, даже если члены экземпляра class Y меняются.

Если вы знакомы с Django, я почти воссоздаю, как работают их формы. Я не решил использовать metaclass для форм, а затем создавать словарь полей при каждом создании нового экземпляра, возможно, мне придется переключиться на использование metaclass.

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

1 Ответ

2 голосов
/ 19 декабря 2011

Для вашего примера, это не имеет значения с неизменяемыми объектами.bi ссылается на новый объект, если он когда-либо назначен.

class A(object):
    x = 0

class B(A):
    pass

ai = A()
bi = B()

print id(ai.x) == id(bi.x)
ai.x=3
print id(ai.x) == id(bi.x)

Результат:

True
False

Обратите внимание, что даже если вы инициализируете x в __init__, этоблагодаря поведению, определяемому реализацией, неизменяемые объекты можно кэшировать и использовать повторно, а экземпляры ai и bi по-прежнему совместно используют объект 0.

class A(object):
    def __init__(self):
        self.x = 0

class B(A):
    pass

ai = A()
bi = B()

print id(ai.x) == id(bi.x)
ai.x=3
print id(ai.x) == id(bi.x)

Результат (с CPython 2.7.2):

True
False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...