我最近开始尝试在Python中使用新款类的风格(那些派生自object的类)。为了熟悉它们,我正试图定义一个类,其中有许多类实例作为属性,每个类实例描述不同类型的数据,例如1维列表,2维数组,标量等。基本上,我希望能够编写以下内容:
some_class.data_type.some_variable
其中data_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
实例的属性的唯一方法是键入collection.set_profiles([...], y1=[...], ...)
,但我认为我不应该直接调用此方法。理想情况下,我希望键入collection.profiles = ([...], y1=[...], ...)
:这样做正确/可行吗?最后,我已经看到很多关于新类风格中装饰器的提及,但这是我很少了解的。在这里使用装饰器是否合适?这是我为这个问题应该更多了解的东西吗?
profiles_1d
设置为公共属性,让设置它的代码传递一个profiles_1d
对象而不是构造函数的参数即可。 - Wooblecollection
已经向使用它的代码返回了profiles_1d
类型的对象;对于一个 setter 来说,传递与 getter 返回值不同的内容违反了最小惊讶原则(principal of least surprise),更不用说 getter 和 setter 在 Python 中已经被淘汰了。 - Wooble