2014-04-17 47 views
0

好了,事情是假設我們有這樣的一段代碼:分配標識符的每一個繼承類

class Master(object): 
    id = SomePythonMagic() 


class Slave1(master): 
    pass 

class Slave2(master): 
    pass 

class Slave3(master): 
    pass 



slave1 = Slave1() 
print slave1.id 
>> 1 
slave2 = Slave2() 
print slave2.id 
>> 2 
slave3 = Slave3() 
print slave3.id 
>> 3 
slave4 = Slave1() 
print slave4.id 
>> 1 

的事情是我想每一個繼承了大師班得到它自己的ID,真棒會如果它可能是一個簡單的計數器,但任何ID都可以。 我希望將ID嵌入到元類中,所以即使我調用Slave1.id,我仍然會得到數字1,就像該類的每個實例一樣。

有沒有人有任何想法或解決這個問題?

+0

請問*你爲什麼要做這個?你有沒有動態生成需要堅持的類,或類似的東西? – goncalopp

+0

爲什麼每次調用子類「__init__」時不要隨機化一個id? – aIKid

+0

@goncalopp讓我們說我想要在所有繼承自某個抽象類的類上放置一個動態標識符,我可以將這些值硬編碼爲所有這些形式,但我只是想要一個更爲pythonic的解決方案。 –

回答

1

這是meta class的情況。元類是定製其他類構造的類。

# Define the metaclass 
class metacls(type): 
    counter = 0 
    def __new__(meta_class, name, bases, attributes): 
     attributes['id'] = metacls.counter 
     metacls.counter += 1 
     return type.__new__(meta_class, name, bases, attributes) 

# Set the metaclass  
class Master(object): __metaclass__ = metacls 

class Slave1(Master): pass 
class Slave2(Master): pass 
class Slave3(Master): pass 

print Slave1.id, Slave1().id 
# 1 1 
print Slave2.id, Slave2().id 
# 2 2 
print Slave3.id, Slave3().id 
# 3 3 
+0

是是是的!!!你先生贏了比賽!我試圖通過擴展類型和添加元類來做到這一點,但我很厭倦這個問題,我完全忘記了我只需要將ID添加到屬性字典中,謝謝您這是我正在瞄準的解決方案! !正確100% –

+0

我會給你10個大拇指,但我不能!再次感謝你 !!! –

+0

@BojanJovanovic很高興能有幫助:-) – thefourtheye

0
class ClassIncrementor: 
    def __init__(self): 
     self.id = 0 
    def __call__(self, cls): 
     self.id += 1 
     cls.id = self.id 
     return cls 
taskIncrementor = ClassIncrementor() 


@taskIncrementor 
class Slave1(object): 
    pass 

@taskIncrementor 
class Slave2(object): 
    pass 

@taskIncrementor 
class Slave3(object): 
    pass 

結果:

(1, <__main__.Slave2 object at 0x021C1DF0>) 
(0, <__main__.Slave1 object at 0x021CA130>) 
(2, <__main__.Slave3 object at 0x021CA290>) 
(2, <__main__.Slave3 object at 0x021CA290>) 
(2, <__main__.Slave3 object at 0x021CA290>) 

這是一個解決方案,我是後,如果任何人有一個更好的主意如何解決此問題,請通過各種手段:)

0

你說的遞增是可選,是嗎?

如果您可以使用僞隨機方式來識別對象,那麼您可能可以在撥打__init__時撥打id(self)

>>> class A(object): 
...  def __init__(self): 
...    self.uid = id(self) 
... 
>>> Stick = A() 
>>> Stick.uid 
4385894928 
>>> Jupiter = A() 
>>> Jupiter.uid 
4385894672 
+1

不,事情是我需要一個唯一的整數作爲每個對象的ID而不是它們的實例。所以STick和Jupiter需要有相同的ID,最好是一個小的int,在每個類的繼承上遞增 –

+0

我不能遺憾地創建任何在基類中做的事情,所以我只添加了一個裝飾器,它將數字遞增1 ...這就像硬編碼的身份證,但是,呃一點點的錯誤容易我wrreckin –

+0

啊,我看到... welp。 :/ –