2016-08-25 38 views
-1

我正在嘗試建模服務,並遇到一些問題。我想要做的是我想這樣的代碼:如何在Python中的類中構建類

>>> service = Service() 
>>> service.name = "Instance1" 
>>> service.name.color = "red" 
>>> service.name.color.enabled = True 

我試過嵌套的類,但我仍然有問題。 這完全違背了約定。如果是的話,我會重新評估,並找到另一種方式來做到這一點。

編輯: 我決定做類似下面的事情,只需要嵌套類來複制Hierarchy。

class Service(object): 
_prefix = 'Service' 
def __init__(self): 
    self.name = Service.Name() 
class Name(object): 
    _prefix = 'Service' 
    def __init__(self): 
     self.color = Service.Name.Color() 
    class Color(object): 
     _prefix = 'Service' 
     def __init__(self, color="N/A"): 
      self.color = color 
+1

「service.name.color」的實際等價物是什麼? –

+1

「我嘗試過嵌套類,但我仍然遇到問題。」什麼樣的問題?也許構圖比嵌套更好。 – DeepSpace

+2

如果'service.name'是一個字符串,那麼' .color'的期望含義/行爲是什麼? –

回答

-1

你應該看着作文,而不是嵌套的類。

class Color: 
    def __init__(self, name): 
     self.name = name 

class Service: 
    def __init__(self, color_obj): 
     self.color_obj = color_obj 

service = Service(Color("yellow")) 
print(service.color_obj.name) 
>> "yellow" 
0

將其他對象作爲類的屬性值並不違背約定。

你可以做的最好的事情就是聲明你想要的類 - 在你的例子中,這些將是class Color,它會有一個布爾屬性enabled

0

我會避免嵌套類,例如:

class Color: 

    def __init__(self, name, enabled=False): 
     self.name = name 
     self.enabled = enabled 

    def __str__(self): 
     return self.name 


class Service: 

    def __init__(self, name): 
     self.name = name 
     self.palette = None 


class Palette: 

    def __init__(self): 
     self.colors = [] 

    def __str__(self): 
     return ' - '.join([str(c) for c in self.colors]) 


if __name__ == "__main__": 
    num_services = 8 
    num_colors = 256 
    offset = num_colors/num_services 

    palettes = [Palette() for i in range(num_services)] 
    services = [Service("Service" + str(i)) for i in range(num_services)] 
    colors = [Color("color" + str(i)) for i in range(num_colors)] 

    for i in range(num_services): 
     subcolors = colors[i * offset:(i + 1) * offset] 
     palettes[i].colors = subcolors 
     services[i].palette = palettes[i] 
     print "Palette {0} -> {1}\n".format(i, palettes[i]) 

雖然我不知道什麼是在這種情況下

0

如果你的意思是嵌套實例使顏色的含義,你只需在相關__init__代碼中創建它們(或之後)

>>> class LR(object): 
... def __init__(self, L=None, R=None): 
...  self.left = L 
...  self.right = R 

>>> class Thing(object): 
... def __init__(self): 
...  self.tree2=LR(LR(1,2), LR(3,4)) 

>>> t = Thing() 
>>> t.tree2.left.right 
2 

在此背景下,Python模塊collections.namedtupleattrs可能有用。 (attrs非常棒:https://attrs.readthedocs.io/en/stable/)。

如果你的意思是像Django的嵌套Meta類一些更深的魔法,那麼源代碼是可用的。 (足夠清楚如何使用Django,但我不能說我理解嵌套的Meta聲明的來龍去脈,足以在我自己的代碼中從頭開始做任何類似的事情)。

Class Person(models.Model) 
    name = models.CharField(max_length = 100) 
    ... # more field declarations 
    Class Meta: 
     unique_together = (("name", "birthdate"),) 
     .... # more Meta-declarations