gpt4 book ai didi

python - `my_instance = MyClass(a, b).my_method(c)` 是可接受的(Pythonic)模式吗?

转载 作者:行者123 更新时间:2023-12-01 08:51:12 25 4
gpt4 key购买 nike

我已经思考这个问题好几个小时了。我有一个类最终需要(但会在没有)一些关键属性的情况下初始化。该类的子类需要不同的属性。

如果有帮助的话,这是半边数据结构中的顶点、边和面的基础 MeshElement 类。

通常,我需要创建一个与另一个实例相似但不相同的实例,因此我有类似下面 borrow_b 的方法,可以将属性从一个实例复制到另一个实例。

我无法想出一个 borrow_b 构造函数,a) 保留/复制 init 的类型提示,b) 可以由具有不同所需属性的子类继承。

这是我最明智的想法,但它打破了“修改对象的方法不返回 None”的规则。

class AB:

def __init__(self, a: Optional[int] = None, b: Optional[int] = None):
if a is not None:
self.a = a
if b is not None:
self.b = b

def borrow_b(self, other):
self.b = other.b # already type hinted when other was initialized
return self

# >>> one_two = AB(1, 2)
# >>> six_two = AB(6).borrow_b(one_two)

我当然意识到这可以分为两行:

six_two = AB(6)
six_two.borrow_b(one_two)

...并允许 borrow_b 返回 None,但我喜欢第一个看起来更像构造函数,而且我不相信第一个不是“Pythonic”。

当然,请倾听更好的解决方案。

FWIW,

six_two = AB(6, six_two.b)

...不是一个“可行”的解决方案,因为并非我想要复制的所有属性都是“必需的”。我通常想要复制一些必需的参数以及通常但不一定附加到网格元素的各种标签(颜色、uv、硬度等)。

最佳答案

使用类方法来实现替代构造函数。对象的目的是跨多个方法调用或函数边界保存状态;创建一个仅在一个范围内使用并立即丢弃的对象表明您首先只需要一个具有适当参数的函数。

class AB:

def __init__(self, a: Optional[int] = None, b: Optional[int] = None):
if a is not None:
self.a = a
if b is not None:
self.b = b

@classmethod
def borrow_b(cls, o1: AB, o2: AB):
return cls(o1.a, o2.b)

one_two = AB(1, 2)
six = AB(6)
six_two = AB.borrow_b(one_two, six)

是的,six 似乎只是为了初始化 six_two 而创建的,但可能它已经因其他原因而存在。您还可以定义一个类方法,专门采用一个对象和任意一组其他参数来覆盖“原型(prototype)”。类似的东西

@classmethod
def make_from_prototype(cls, prototype, **kwargs):
new_obj = cls(prototype.a, prototype.b)
for attr, value in kwargs:
setattr(new_obj, attr, value)
return new_obj

...

one_two = AB(1,2)
six_two = AB.make_from_prototype(one_two, b=6)

一个缺点是 make_from_prototype 绕过类型提示,因为 **kwargs 可以采用任意一组关键字参数。最好是用作私有(private)类方法,仅用作专用类方法的基本实现,例如 borrow_b:

@classmethod
def _make_from_prototype(cls, prototype: AB, **kwargs):
# Same definition as above

@classmethod
def borrow_b(cls, o1: AB, o2:AB):
return cls._make_from_prototype(o1, b=o2.b)

关于python - `my_instance = MyClass(a, b).my_method(c)` 是可接受的(Pythonic)模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53108988/

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