クラスのコンストラクターでプロパティを宣言したいと思います。
クラスMaterialOneは、私が現在どのようにそれを持っているかを示しています。すべてのプロパティは個別に定義する必要があります。ただし、同じfset / fget/fdelを指定したい類似のプロパティのグループがあります。
すべてのプロパティを明示的に記述するには多くのコードが必要になるため、より簡潔な方法でプロパティを定義したいと思います。したがって、コンストラクターにこれを処理させることを考えました。Class MateralTwoは、私がそれをどのように念頭に置いているかを示しています。
TypeErrorsが発生するため、残念ながら機能しません。
TypeError: get_property() takes exactly 1 argument (2 given)
なぜ文句を言うのかは理解できますが、解決策は思いつきません。コンストラクターのリストからプロパティを定義する必要は必ずしもありません。私が探しているのは、それらを定義するためのより簡潔でクリーンな方法です。
class MaterialOne(object):
def __init__(self):
pass;
def del_property(attr):
"""Abstract deller"""
def del_attr(self):
setattr(self, attr, None);
return del_attr
def set_property(attr):
"""Abstract setter."""
def set_attr(self, x):
setattr(self, attr, x);
return set_attr
def get_property(attr):
"""Abstract getter"""
def get_attr(self):
if getattr(self, attr) is not None:
return getattr(self, attr);
else:
return 'Some calculated value..'
return get_attr
_young = None;
_shear = None;
_poisson = None;
young = property(fget=get_property('_young'), fset=set_property('_young'), fdel=del_property('_young'));
shear = property(fget=get_property('_shear'), fset=set_property('_shear'), fdel=del_property('_shear'));
poisson = property(fget=get_property('_poisson'), fset=set_property('_poisson'), fdel=del_property('_poisson'));
class MaterialTwo(object):
def __init__(self):
properties = ['young', 'shear', 'poisson'];
self.create_properties(properties)
def del_property(attr):
"""Abstract deller"""
def del_attr(self):
setattr(self, attr, None);
return del_attr
def set_property(attr):
"""Abstract setter."""
def set_attr(self, x):
setattr(self, attr, x);
return set_attr
def get_property(attr):
"""Abstract getter"""
def get_attr(self):
if getattr(self, attr) is not None:
return getattr(self, attr);
else:
return 'Some calculated value..'
return get_attr
def create_properties(self, items):
for item in items:
storage = '_'+item;
setattr(self, storage, None);
setattr(self, item, property(fget=self.get_property(storage), fset=self.set_property(storage), fdel=self.del_property(storage)));
steel = MaterialOne();
steel.young = 2e11;
steel.poisson = 0.3;
print steel.poisson
print steel.shear
carbon = MaterialTwo();
carbon.young = 2e11;
carbon.poisson = 0.3;
print carbon.poisson
print carbon.shear
コードについてもう少し明確にするため。私が書きたいのは、材料のクラス、固体、液体、気体であり、それぞれが材料のサブクラスです。多くの材料特性が割り当てられます。定義されているものに基づいて計算できるものもあります。たとえば、2つの弾性係数が与えられると、3分の1を計算できます。
これは、MaterialOneと非常によく似たものを使用して実装しました。しかし、私はより多くの材料特性を取得し、これらの種類の計算もより多く含めるようになるので、よりクリーンで整理されたものにしたいと思います。MaterialTwoで書いたように書くことは、私にとって可能性です。