1

最初に一般的な説明、次に私が実際に取り組んでいること:あなたがリンゴのグループを持っているとしましょう。type = "Green Apple"andなどの一部のプロパティは共有できますが、 andや。picked_date = "Aug 12 2012"などの他のデータはアップル間で異なる可能性があります。アップル間で編集可能な値を共有するだけでなく、グループ内のアップルごとに個別の属性を持たせるための最もPython的な方法は何ですか?、、から来て、私の最初の本能は一般的な構造体であり、各リンゴのインスタンスにグループ情報が含まれているのはばかげているように見えるので、一般的な構造体へのポインタを持つ各リンゴの構造体です。すべてのリンゴを編集しますがis_bruisedweightsizetypeCC++type = "Red Apple"typeプログラミング力の無駄である値。

実際のコードでは、現在の作業プロジェクトで、会社にとって意味のある方法で出力を解析するのに役立つgitスクリプトに取り組んでいます。私は(a)リスト、(b)タプル、(c)辞書、および(d)Pythonのクラスを読んでいますが、このデータを表現するための最良の方法を見つけようとして本当に行き詰まっています。

具体的には、私はgit commitを処理しています。関係する値には、「コミットの作成者を出力しますか?」などのすべてのコミット間で共有される一般的なプロパティと、「 commitxには作成者y"があります。私の現在の解決策はエレガントではありません:

class Commit(object):
    def __init__(self, author="", committer="", date="", issue="",
                 instruction="", message="", review="", sha="", short=""):
        self.author = author     
        self.committer = committer   
        self.date = date  
        self.instruction = instruction         
        self.issue = issue
        self.message = message
        self.review = review           
        self.sha = sha
        self.short = short

このクラスには、特定のコミットに関連付けられたデータが含まれています。これで、すべてのコミットのデータが次のように保存されます。

 Attribute = namedtuple('Attribute', ['display', 'critical'])

 commit_attr = {'author': Attribute(display = True, critical = True),
                'committer': Attribute(display = True, critical = True),
                'date': Attribute(display = False, critical = False),
                'instruction': Attribute(display = True, critical = False),
                'issue': Attribute(display = True, critical = False),
                'message': Attribute(display = True, critical = False),
                'review': Attribute(display = True, critical = False),
                'sha': Attribute(display = True, critical = True),
                'short': Attribute(display = True, critical = True)}

これは、フィールドに名前付きタプルが含まれる辞書です。「クリティカル」は、そのフィールドをコミットで表示する必要があるかどうかを示します。表示は、フィールドを印刷するかどうかを決定するために使用されます。

これが私の問題です:Pythonの関連データをコヒーレントメソッドにグループ化する必要があることは知っていますが、ここでそれを行う方法がわかりません:クラスなどの「ポインター」を持つことができますが、これはそうではありませself.attr = commit_attrん非常にクリーンで、そのオブジェクトがそのアドレスを保持している、つまり可変であることに依存します。そうでない場合、一般属性の値を変更すると、クラスCommit()に関連付けられなくなります。Commit()

4

1 に答える 1

2

これが役に立つかどうかは完全にはわかりませんが、Python にはクラス インスタンス間で共有されるクラス属性があります。

>>> class A(object):
...   foo = 'bar'  # Notice that this isn't in an __init__ function definition
... 
>>> a = A()        # Just creating two distinct instances of A
>>> b = A()
>>> A.foo = 'baz'  # Now, I'm setting the class attribute
>>> b.foo
'baz'              # Notice how all instances of A changed
>>> a.foo
'baz'
>>> 

クラス属性を編集すると、すべてのインスタンスが一度に影響を受けます。

于 2012-08-22T22:15:16.433 に答える