如何在Python中使用类构建类

时间:2016-08-25 13:40:40

标签: python class

我正在尝试为服务建模,但我遇到了一些问题。我想要做的是在代码中我想要这样的东西:

>>> 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

4 个答案:

答案 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.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

答案 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"