そして、最良の方法として、Python 的に、そして可能な限り少ないコード行でという意味です。
私はPythonで属性を持つクラスを定義することに慣れています。
class MyClass(object):
def __init__(self):
self.value = 5
self.value
ただし、が特定の型の値しかとらないようにしなければならないことがよくあります。過去に(PHP OOPのバックグラウンドから来ました)、これに似たgetter-setterメソッドでこれを行いました:
def value(self, new_value = -1)
if new_value == -1:
return self.value
if isinstance(new_value, int) and new_value > -1:
self.value = new_value
else:
raise TypeError
次に でアクセスself.value
しself.value()
、 で設定しself.value(67)
ます。通常、直接アクセスできないself.value
ように名前を変更します。self.__value
最近、記述子を発見しました (または発見中です)。ここでの優れた議論に密接に従って、私は次のようなものを書きました:
class ValidatedAttribute(object):
def __init__(self, key, kind):
self.key = key
self.kind = kind
def __get__(self, instance, owner):
if self.key not in instance.__dict__:
raise AttributeError, self.key
return instance.__dict__[self.key]
def __set__(self, instance, value):
if not isinstance(value, self.kind):
raise TypeError, self.kind
instance.__dict__[self.key] = value
class MyUsefulClass(object):
a = ValidatedAttribute("a", int)
しかし、いくつか質問があります!
まず、正確にはMyUsefulClass().a
何ですか?クラスのインスタンスに何らかの形でバインドされた ValidatedAttribute クラスのインスタンスMyUsefulClass
ですか?
第二に、私が本当に欲しいのは、次のようなものです。
class MyUsefulClass(object):
def __init__(self):
self.value = Checker(int, 99)
def Checker(self, kind, default):
# Code for verifying that associated attribute is of type kind.
そして、他の記述子クラス全体を使用することなく、属性アクセスをある種のインターセプトメソッドにバインドします。
私の理解が不足していたら申し訳ありません - 私はまだ新しいスタイルの Python クラスに取り組んでいます。正しい方向への助けや指針をいただければ幸いです。