私は最近、Python で新しいスタイルのクラス (オブジェクトから派生したもの) を使用しようとしていると述べました。それらに慣れるための演習として、属性として多数のクラス インスタンスを持つクラスを定義しようとしています。これらのクラス インスタンスのそれぞれは、1 次元リスト、2 次元配列、スカラーなどの異なるタイプのデータを記述します。本質的に私は書けるようになりたい
some_class.data_type.some_variable
wheredata_type
は、変数のコレクションを記述するクラス インスタンスです。profiles_1d
以下は、インスタンスとかなり一般的な名前を使用して、これを実装する最初の試みです。
class profiles_1d(object):
def __init__(self, x, y1=None, y2=None, y3=None):
self.x = x
self.y1 = y1
self.y2 = y2
self.y3 = y3
class collection(object):
def __init__(self):
self._profiles_1d = None
def get_profiles(self):
return self._profiles_1d
def set_profiles(self, x, *args, **kwargs):
self._profiles_1d = profiles_1d(x, *args, **kwargs)
def del_profiles(self):
self._profiles_1d = None
profiles1d = property(fget=get_profiles, fset=set_profiles, fdel=del_profiles,
doc="One dimensional profiles")
上記のコードは、この問題に取り組む適切な方法でしょうか。私が見た使用例はproperty
、変数の値を設定するだけです。ここでは、あるクラスのインスタンスを初期化するために set メソッドが必要です。そうでない場合は、これを実装するためのより良い方法の提案があれば大歓迎です。
さらに、 set メソッドを定義する方法は大丈夫ですか? 一般的に、 set メソッドは、私が理解している限り、ユーザーが入力したときに何をすべきかを定義します。この例では、
collection.profiles1d = ...
profiles_1d
上記のコードでインスタンスの属性を正しく設定できる唯一の方法は typecollection.set_profiles([...], y1=[...], ...)
ですが、このメソッドを直接呼び出すべきではないと思います。理想的には、次のように入力したいと思いcollection.profiles = ([...], y1=[...], ...)
ます:これは正しい/可能ですか?
最後に、クラスの新しいスタイルに関して多くのデコレーターが言及されているのを見てきましたが、これについてはほとんど知りません。ここでデコレータの使用は適切ですか? これは、この問題についてもっと知っておくべきことですか?