gpt4 book ai didi

python - 使用类实例作为类属性、描述符和特性

转载 作者:太空狗 更新时间:2023-10-29 20:52:41 24 4
gpt4 key购买 nike

我最近表示尝试在 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=[...], ...):这是正确的/可能的吗?

最后,我看到了一个关于新类风格的装饰器,但我对它知之甚少。这里使用装饰器合适吗?对于这个问题,我应该了解更多吗?

最佳答案

首先,您正在学习新型类(class)是件好事。他们有很多优势。

在 Python 中创建属性的现代方法是:

class Collection(object):
def __init__(self):
self._profiles_1d = None

@property
def profiles(self):
"""One dimensional profiles"""
return self._profiles_1d

@profiles.setter
def profiles(self, argtuple):
args, kwargs = argtuple
self._profiles_1d = profiles_1d(*args, **kwargs)

@profiles.deleter
def profiles(self):
self._profiles_1d = None

然后通过执行设置配置文件

collection = Collection()
collection.profiles = (arg1, arg2, arg3), {'kwarg1':val1, 'kwarg2':val2}

注意所有三个方法都具有相同的名称。

通常不会这样做;要么让他们将属性传递给 collection 的构造函数,要么让他们自己创建 profiles_1d 然后执行 collections.profiles = myprofiles1d 或将其传递给构造函数。

当您希望属性管理对自身的访问而不是类管理对属性的访问时,请将属性设为具有描述符的类。与上面的属性示例不同,如果您实际上希望将数据存储在属性中(而不是另一个人造私有(private)实例变量),请执行此操作。此外,如果您要一遍又一遍地使用相同的属性,这也很有用 - 将其设为描述符,您无需多次编写代码或使用基类。

我真的很喜欢@S.Lott 的页面——Python 的构建技能 Attributes, Properties and Descriptors .

关于python - 使用类实例作为类属性、描述符和特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7024915/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com