gpt4 book ai didi

python:获取构造函数以返回现有对象而不是新对象

转载 作者:行者123 更新时间:2023-12-04 14:36:35 30 4
gpt4 key购买 nike

我有一个知道其现有实例的类。有时我希望类构造函数返回一个现有对象而不是创建一个新对象。

class X:
def __new__(cls, arg):
i = f(arg)
if i:
return X._registry[i]
else:
return object.__new__(cls)
# more stuff here (such as __init_, _registry, etc.)

当然,如果执行第一个分支,我就不需要 __init__ ,但它无论如何都会被调用。有什么好办法告诉 __init__什么都不做?

我大概可以添加一些属性来跟踪是否 __init__已经运行了,但也许有更好的方法?

最佳答案

在支持私有(private)构造函数的语言(C#、Dart、Scala 等)中,工厂方法为这个问题提供了一个强大的解决方案。

然而,在 Python 中,类构造函数始终是可访问的,因此类的用户可能很容易忘记工厂方法并直接调用构造函数,从而产生应该唯一的对象的重复副本。

使用元类可以实现对这个问题的万无一失的解决方案。下面的示例假设第零个构造函数参数可用于唯一标识每个实例:

class Unique(type):

def __call__(cls, *args, **kwargs):
if args[0] not in cls._cache:
self = cls.__new__(cls, *args, **kwargs)
cls.__init__(self, *args, **kwargs)
cls._cache[args[0]] = self
return cls._cache[args[0]]

def __init__(cls, name, bases, attributes):
super().__init__(name, bases, attributes)
cls._cache = {}

它可以按如下方式使用:
class Country(metaclass=Unique):
def __init__(self, name: str, population: float, nationalDish: str):
self.name = name
self.population = population
self.nationalDish = nationalDish

placeA = Country("Netherlands", 16.8e6, "Stamppot")
placeB = Country("Yemen", 24.41e6, "Saltah")
placeC = Country("Netherlands", 11, "Children's tears")

print(placeA is placeB) # -> False
print(placeA is placeC) # -> True
print(placeC.nationalDish) # -> Stamppot

总之,如果您想在运行时生成一组唯一的对象(可能使用其中条目可能重复的数据),则此方法很有用。

关于python:获取构造函数以返回现有对象而不是新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3615565/

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