python: изменение класса объекта в многоуровневом наследовании - PullRequest
0 голосов
/ 15 октября 2011

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

У меня есть программа, которая имеет многоуровневое наследование, и я пытаюсь выяснить, как лучше всего было бы изменить класс объекта на подкласс. Допустим, у меня есть следующий код:

class A(object):

    def __init(self, filename, ..)
        super(A, self).__init__()
        ...some assignments here

class B(A):

    def __init(self, filename, ..)
        super(B, self).__init__()
        ...some assignments here

class C(A):

    def __init(self, filename, ..)
        super(C, self).__init__()
        ...some assignments here

и так далее ...
Я всегда хочу начать инициализацию объекта класса А. В зависимости от типа используемого файла, назначения могут различаться, и в зависимости от этих назначений я могу определить, какой это тип файла. Поэтому теперь я хочу изменить класс объекта на любой подходящий класс ..

Я знаю, что мог передать объект A в B или C и использовать copy или deepcopy, но в A я назначаю объект, ссылка на который не должна изменяться, и некоторые другие, где он должен меняться. Также мне нужно будет удалить этот объект A после инициализации B или C.

class B(A):

    def __init__(self, filename, objA = None):
        if objA is not None:
            self.__dict__ = copy.deepcopy(objA.__dict__)
            del(objA)
        else:
            super(B, self).__init__(filename)

Также существует другая возможность, изменив атрибут _ class на другой класс и используя какой-то метод обновления нового класса.
Я хотел бы знать, какой из двух подходов рекомендуется или есть даже лучший. Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 15 октября 2011

То, что вам нужно, это фабрика: функция, которая открывает файл, читает то, что ему нужно, чтобы выяснить, какой это тип файла, а затем инициализирует и возвращает объект соответствующего класса.

Если вы хотите сохранить класс, вам нужно переопределить __new__() и затем вернуть объект нужного класса вместо его собственного класса.(Вы также можете сделать это, используя метакласс и переопределив __call__() для этого.)

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

1 голос
/ 15 октября 2011

Этот код объяснит, что вы хотите сделать

class B(object):
    def x(self):
        print 'b'

class A(object):
    def x(self):
        print 'a'

Теперь мы создаем два объекта

a = a()
b = b()

a.x()
a

b.x()
b

теперь, если вы хотите, чтобы 'a' стало объектом B

 a.__class__ = type(b)

или

 a.__class__ = B

теперь атрибут x относится к классу B.

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