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呼び出される with 関数を作成できます。

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] を使用できると思います。

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

于 2012-07-01T02:47:41.407 に答える