【发布时间】:2011-10-24 21:24:34
【问题描述】:
我最近说过尝试在 Python 中使用更新的类样式(那些从对象派生的)。作为熟悉它们的练习,我试图定义一个具有许多类实例作为属性的类,每个类实例描述不同类型的数据,例如一维列表、二维数组、标量等。基本上我希望能够编写
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=[...], ...):这是正确的/可能的吗?
最后,我看到一个装饰器提到了很多关于新样式的类,但我对此知之甚少。这里使用装饰器合适吗?对于这个问题,这是我应该了解的更多信息吗?
【问题讨论】:
-
为什么要使用 getter 和 getter 以及私有属性?只需将
profiles_1d设为公共属性并让设置它的代码传递profiles_1d对象而不是构造函数的参数。 -
作为用户,处理主类肯定会更容易(在这种情况下为
collection)。但你是对的,这将是一个简单的解决方案。 -
您的
collection已经将profiles_1d类型的对象返回给使用它的代码;它违反了 setter 传递与 getter 返回的不同的东西的最不意外原则(更不用说 getter 和 setter 完全不符合 Python)。 -
@Wooble 谢谢 - 我会记住这一点的。
标签: python class properties descriptor new-style-class