gpt4 book ai didi

python - 用于从类中生成新对象的惯用 Python

转载 作者:太空狗 更新时间:2023-10-29 17:15:55 26 4
gpt4 key购买 nike

我在我的一个对象上有一个方法,它返回同一类的一个新实例。我试图找出最惯用的方法来编写此方法,以便它在不重复代码的情况下生成相同类型的新对象。

由于此方法使用实例中的数据,因此我的第一遍是:

class Foo(object):
def get_new(self):
data = # Do interesting things
return Foo(data)

但是,如果我将 Foo 子类化并且不覆盖 get_new,则在 SubFoo 上调用 get_new 将返回 Foo!所以,我可以写一个类方法:

class Foo(object):

@classmethod
def get_new(cls, obj):
data = # Munge about in objects internals
return cls(data)

但是,我正在访问的数据是特定于对象的,因此它似乎打破了封装,因为这不是一个“正常”(未修饰的)方法。此外,您还必须像 SubFoo.get_new(sub_foo_inst) 那样调用它,这似乎是多余的。我希望对象只“知道”要返回哪种类型——与其自身相同的类型!

我想也可以在类中添加一个工厂方法,并在所有地方覆盖返回类型,而不会重复逻辑,但这似乎会给子类带来很多工作。

所以,我的问题是,编写一种方法的最佳方法是什么,该方法可以在类的类型中提供灵 active ,而无需到处注释类型?

最佳答案

如果你想让子类化更灵活,你可以简单地使用 self.__class__特殊属性:

class Foo(object):
def __init__(self, data):
self.data = data

def get_new(self):
data = # Do interesting things
return self.__class__(data)

请注意,使用 @classmethod 方法将阻止您访问任何一个实例中的数据,在 #Do interesting things 依赖的实例中将其作为可行的解决方案移除实例中存储的数据。

对于 Python 2,我不建议使用 type(self),因为这会为 classic classes 返回一个不合适的值(即,那些不是从基础 object 子类化的):

>>> class Foo:
... pass
...
>>> f = Foo()
>>> type(f)
<type 'instance'>
>>> f.__class__ # Note that the __class__ attribute still works
<class '__main__.Foo'>

对于 Python 3,这不是什么大问题,因为所有类都派生自 object,但是,我相信 self.__class__ 被认为是更 Pythonic成语。

关于python - 用于从类中生成新对象的惯用 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4996565/

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