下面,base_id
和_id
是一个类变量,并在所有子类之间共享
有没有办法将它们分成每个类?
from itertools import count
class Parent(object):
base_id = 0
_id = count(0)
def __init__(self):
self.id = self.base_id + self._id.next()
class Child1(Parent):
base_id = 100
def __init__(self):
Parent.__init__(self)
print 'Child1:', self.id
class Child2(Parent):
base_id = 200
def __init__(self):
Parent.__init__(self)
print 'Child2:', self.id
c1 = Child1() # 100
c2 = Child2() # 201 <- want this to be 200
c1 = Child1() # 102 <- want this to be 101
c2 = Child2() # 203 <- want this to be 201
答案 0 :(得分:6)
如果您确实需要以这种方式使用ID,请使用参数:
class Parent(object):
def __init__(self, id):
self.id = id
class Child1(Parent):
_id_counter = count(0)
def __init__(self):
Parent.__init__(self, 100 + self._id_counter.next())
print 'Child1:', self.id
等
这假设您不能直接构造Parent
的实例,但这对您的示例代码来说看起来很合理。
答案 1 :(得分:3)
如果您不想像falsetru建议那样违反DRY原则,则需要使用元类。我想写点什么,但there's already a good long description of metaclasses on SO,所以检查一下。
简而言之,元类可以控制子类的创建。
基本上,您需要做的是,在创建Parent
的子类时,将_id
成员添加到新创建的子类中。
答案 2 :(得分:2)
正如您在问题中所说,_id
由父母和所有子类共享。为每个子类定义_id
。
from itertools import count
class Parent(object):
base_id = 0
_id = count(0)
def __init__(self):
self.id = self.base_id + self._id.next()
class Child1(Parent):
base_id = 100
_id = count(0) # <-------
def __init__(self):
Parent.__init__(self)
print 'Child1:', self.id
class Child2(Parent):
base_id = 200
_id = count(0) # <-------
def __init__(self):
Parent.__init__(self)
print 'Child2:', self.id
c1 = Child1() # 100
c2 = Child2() # 200
c1 = Child1() # 101
c2 = Child2() # 201
<强>更新强>
使用元类:
class IdGenerator(type):
def __new__(mcs, name, bases, attrs):
attrs['_id'] = count(0)
return type.__new__(mcs, name, bases, attrs)
class Parent(object):
__metaclass__ = IdGenerator
base_id = 0
def __init__(self):
self.id = self.base_id + next(self._id)