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
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
В общем, наследование - это правильный путь, как уже отмечали другие плакаты.
Однако, если вы действительно хотите воссоздать один и тот же тип с другим именем и без наследования, вы можете сделать это следующим образом:
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]' (!)
Правильный способ "скопировать" класс, по вашему мнению, наследует:
class B(A):
pass
Вы можете использовать функцию factory:
def get_A():
class A(object):
ARG = 1
return A
A = get_A()
B = get_A()
Я думаю, вы неправильно понимаете значение статической переменной здесь. Каждый раз, когда вы объявляете переменную вне метода, а не в форме self.some_thing
, переменная будет рассматриваться как статическая переменная класса (например, ваша переменная ARG). Таким образом, каждый объект (экземпляр) класса, который изменяет статическую переменную, приведет к изменению всех других объектов в одном классе. На самом деле эта работа действительно работает.
Создайте свой собственный конструктор и просто продублируйте, как вы создали свой оригинальный класс:
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
Если вы хотите создать только один экземпляр класса, просто выполните его:
>>> class A(object):
... ARG=1
...
>>> a = A()
>>> A().ARG
1
>>> b = A()
>>> b.ARG
1
>>> a.ARG=2
>>> b.ARG
1