0

User というクラスがあります。

class User(object):

    def __init__(self, arg1, ..., traits = None):
        self.arg1 = arg1
        ...
        self.traits = traits

ユーザーにはtraits辞書であるプロパティがあります。メールアドレスやユーザーIDなどの基本的なもの以外のユーザーに関する情報をもう少し保持する必要がある場合に、入力できるキャッチオールになることを目的としています.

Traitsクラスを作成し、その中にプロパティを設定することは多かれ少なかれ効率的__init__でしょsetattrうか? ルックアップはよりうまく機能しますか? この機械が私に何かをもたらしてくれるものはありますか?

4

2 に答える 2

2

私には問題ないように見えますが、次のように書き直したくなります。

class User(object):
    def __init__(self, arg1, arg2, **traits):
        self.arg1 = arg1
        self.arg2 = arg2
        self.traits = traits

本当に必要な場合は、属性が見つからない場合に特性ディクショナリにフォールバックするようにオーバーライドできます。

def __getattr__(self, name):
    return self.traits[name]

例:

>>> u = User(1, 2, email='something')
>>> y = User(1, 2, email='bob', telno='999')
>>> u.arg1, u.arg2, u.email
(1, 2, 'something')
>>> y.arg1, y.arg2, y.email, y.telno
(1, 2, 'bob', '999')
>>> y.arg1, y.arg2, y.email, y.something
Traceback (most recent call last):
  File "<pyshell#105>", line 1, in <module>
    y.arg1, y.arg2, y.email, y.something
  File "/home/jon/adfafasdf.py", line 7, in __getattr__
    return self.traits[name]
KeyError: 'something'

したがって、それをより賢明なエラーにして、次のように変更することをお勧めします。

def __getattr__(self, name):
    try:
        return self.traits[name]
    except KeyError as e:
        raise AttributeError() # with suitably formatted string
于 2013-01-24T15:30:37.193 に答える
2

インスタンスを__dict__直接変更できます(実装されていない__slots__か、そのようなばかげたことを前提としています)

簡単な例を次に示します。

class Traits(object):
    pass

class User(object):
    def __init__(self,**traits):
        self.traits = Traits()
        self.traits.__dict__.update(traits)

a = User(eye_color="blue")
print a.traits.eye_color

もちろん、次のようにする方がおそらく安全です(ただし、効率はわずかに低下します)。

class User(object):
    def __init__(self,**traits):
        self.traits = Traits()
        for k,v in traits.items():
            setattr(traits,k,v)

これは実際には、同じ API を提供するための 1 行の追加コードです。Traits誰かがさまざまな記述子 (プロパティなど) を提供するため に何をいじったのかがわからないため、やみくもに書き込むと潜在的に有害な場合でもsetattr、そのすべてが正しく行われるため、より安全です。__dict__

于 2013-01-24T15:24:43.377 に答える