2

我有一个包含大量属性的类。更具体地说,该类代表我的路由器。我想将其属性划分为类别,这意味着为了检索 LAN ip 和 WAN ip,我不必键入:

router.wan_ip
router.lan_ip

但改为输入:

router.wan.ip
router.lan.ip

这些属性是动态的,在调用它们的函数时会被检索到。我目前的实现:

class Category(object):
    def __init__(self, parent):
        self._parent = parent

class Lan(Category):
    @property
    def ip(self):
        self._parent._get_property("lanip")

class Wan(Category):
    @property
    def ip(self):
        self._parent._get_property("wanip")

class Router(object):
    def __init__(self, ):
        self.lan = Lan(self)
        self.wan = Wan(self)

    def _get_property(self, property_name):
        # Some code here

但如果有更好的方法,我会更伤心

4

3 回答 3

3

你可能想多了这个结构,但如果你想要对象......

Wan并且Lan不应该存在。您可以为该类传递一个前缀,Category以便它搜索...ip. 该_get_property方法可以用字典代替。如果您需要即时计算值,您可以创建一个dict要调用的函数。

class Category(object):
    def __init__(self, parent, prefix):
        self.parent = parent
        self.prefix = prefix
    @property
    def ip(self):
        self.parent.data[self.prefix + "ip"]

class Router(object):
    def __init__(self, data):
        self.lan = Category(self, 'lan')
        self.wan = Category(self, 'wan')
        self.data = data

顺便说一句,这个程序根本不需要任何类。好像你只需要字典。如果需要,您可以创建一个函数来构建这些字典

router = {'wan': {'ip': '1.2.3.4'}, 'lan': {'ip': '2.3.4.5'}}
于 2012-06-30T15:20:33.523 回答
0

您可以使用__getattr__它来访问该名称实际上并不存在的属性,方法是检查属性的名称并将其映射到实际属性。

于 2012-06-30T15:17:22.253 回答
0

我认为您可以将描述符 [1] 用于唯一的 Category 类。

[1] http://docs.python.org/reference/datamodel.html#descriptors

于 2012-07-01T02:47:41.407 回答