我有一个包含大量属性的类。更具体地说,该类代表我的路由器。 我想将其属性划分为类别,这意味着为了检索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
但是如果有更好的方法我会更健康
答案 0 :(得分: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'}}
答案 1 :(得分:0)
您可以使用__getattr__
,通过检查属性的名称并将其映射到实际属性,允许您访问该名称实际不存在的属性。
答案 2 :(得分:0)
我认为您可以将描述符[1]用于唯一的类别类。
[1] http://docs.python.org/reference/datamodel.html#descriptors