Подтвердить что ты не робот

Как скопировать класс python?

deepcopy from copy не копирует класс:

>>> class A(object):
>>>     ARG = 1

>>> B = deepcopy(A)

>>> A().ARG
>>> 1

>>> B().ARG
>>> 1

>>> A.ARG = 2

>>> B().ARG
>>> 2

Это только путь?

B(A):
    pass
4b9b3361

Ответ 1

В общем, наследование - это правильный путь, как уже отмечали другие плакаты.

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

class B(object):
    x = 3

CopyOfB = type('CopyOfB', B.__bases__, dict(B.__dict__))

b = B()
cob = CopyOfB()

print b.x   # Prints '3'
print cob.x # Prints '3'

b.x = 2
cob.x = 4

print b.x   # Prints '2'
print cob.x # Prints '4'

Вы должны быть осторожны с изменяемыми значениями атрибутов:

class C(object):
    x = []

CopyOfC = type('CopyOfC', C.__bases__, dict(C.__dict__))

c = C()
coc = CopyOfC()

c.x.append(1)
coc.x.append(2)

print c.x   # Prints '[1, 2]' (!)
print coc.x # Prints '[1, 2]' (!)

Ответ 2

Правильный способ "скопировать" класс, по вашему мнению, наследует:

class B(A):
    pass

Ответ 3

Вы можете использовать функцию factory:

def get_A():
    class A(object):
        ARG = 1
    return A

A = get_A()
B = get_A()

Ответ 4

Я думаю, вы неправильно понимаете значение статической переменной здесь. Каждый раз, когда вы объявляете переменную вне метода, а не в форме self.some_thing, переменная будет рассматриваться как статическая переменная класса (например, ваша переменная ARG). Таким образом, каждый объект (экземпляр) класса, который изменяет статическую переменную, приведет к изменению всех других объектов в одном классе. На самом деле эта работа действительно работает.

Ответ 5

Создайте свой собственный конструктор и просто продублируйте, как вы создали свой оригинальный класс:

class MyClass(object):
    def __init__(self, **kw):
        self.kw = kw
        self.__dict__.update(kw)

    def copy(self):
        return MyClass(**self.kw)

Я попытался бы избежать необходимости копировать объекты в первую очередь.


sidenote: вы также можете уйти от дел:

B = deepcopy(A)
B.__dict__ = deepcopy(A.__dict__)

Но это, вероятно, очень не так, и вы не должны этого делать. на самом деле AttributeError: 'dictproxy' object has no attribute 'update' в соответствии с OP

Ответ 6

Если вы хотите создать только один экземпляр класса, просто выполните его:

 >>> class A(object):
...    ARG=1
... 
 >>> a = A()
 >>> A().ARG
 1
 >>> b = A()
 >>> b.ARG
 1
 >>> a.ARG=2
 >>> b.ARG
 1