0

のような属性を持つ Python オブジェクトを見てきました%values。.を発生させるため、そのような属性にはアクセスできませんSyntaxError。またsetattr、なしで作成する必要があるようですSyntaxError:

class A(object):
    pass
a = A()
setattr(a, "%values", 42)
a.%values    # results in SyntaxError: invalid syntax
class B(object):
    def __init__(self):
        self.%values = 42    # results in SyntaxError: invalid syntax

%ここに目的や意味はありますか?%valuesを使用して設定できるのにsetattr、そうでない場合は が発生するのはなぜSyntaxErrorですか?

4

2 に答える 2

1

% には目的や意味がありますか?

ほとんどの場合、通常のドット表記を使用してこれらの属性にアクセスできないようにするためです。これにより、それらを使用することを思いとどまらせ、それらを使用しているアプリケーションに対して何らかの方法で「プライベート」にします。ただし、これを達成するためのより良い方法がおそらくあります。このようなコードを見たら、私はそれをにおいと呼ぶでしょう。

setattr を使用して %values を設定できるのに、そうしないと SyntaxError が発生するのはなぜですか?

属性はディクショナリに格納され、ディクショナリ キーは何でもかまいません。Python 識別子と同じ規則に従う必要はありません。Python が行うほとんどのことは、それらが文字列であることを確認することです。(一部の古いバージョンの Python では、渡される名前setattrが有効な Python 識別子であることが強制されますが、これは言語から削除されました。)

于 2015-03-20T23:39:36.580 に答える
1

%valuesPython では有効な識別子ではありません。この質問で発見されたようにsetattr()、オブジェクトの__dict__属性を直接変更するだけなので、それは問題ではありません。object.__setattr__()通常の変数割り当てが試行されたときに呼び出されますが、有効な識別子を気にしていないようです:

class A(object):
    pass
a=A()
a.__setattr__("%val",1) #works
print a.__dict__ #prints "{'%val': 1}"

setattr()__setattr__()オブジェクト関数を変更する前に存在する場合は、オブジェクト関数を呼び出すようです__dict__:

class A:
    def __setattr__(self,name,value):
        print "__setattr__ called"
a=A()
a.val=1 #prints "__setattr__ called"

ただし、実際のコードでは、変数名がパーセント記号で始まるように設定し__dict__たり呼び出し__setattr__()たりする理由はないと思います。setattr()

于 2015-03-20T23:39:54.980 に答える