我正在尝试为服务建模,但我遇到了一些问题。我想要做的是在代码中我想要这样的东西:
>>> 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
答案 0 :(得分:0)
将其他对象作为类属性的值不违反惯例。
你可以做的最好的事情是宣告你想要的类 - 在你的例子中,这些将是class Color
,它将具有布尔属性enabled
。
答案 1 :(得分: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])
虽然我不确定在这种情况下启用颜色的含义是什么
答案 2 :(得分: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.namedtuple
和attrs
。 (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
答案 3 :(得分:-2)
你应该看组合,而不是嵌套类。
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"