我想构建一个类,它仅仅是一些数据的 Package 器。这是基本的想法:
class Fruits:
fruits = [ 'apple', 'orange', 'cherry' ]
不过,我的fruits不是字符串,而是前面定义的类:
class Apple: pass
class Orange: pass
class Cherry: pass
class Fruits:
fruits = [ Apple(), Orange(), Cherry() ]
不过,我的水果类有点复杂:
from dataclasses import dataclass
@dataclass
class Apple:
color: str
size: float
price: float
因为我的fruit-classes非常复杂,我需要一些helper函数来避免在调用构造函数时大量的代码重复:
class Fruits:
@staticmethod
def green_apple(size, price_factor=2.5):
return Apple(color='green', size=size, price=size * price_factor)
fruits = [ green_apple(3), green_apple(3, price_factor=1.2) ]
到目前为止,这适用于静态方法。
现在我想多一层抽象:
class Fruits:
@staticmethod
def green_apple(size, price_factor=2.5):
return Apple(color='green', size=size, price=size * price_factor)
@staticmethod
def cheap_green_apple(size):
return green_apple(size, price_factor=1.2)
# alternative spelling:
# return Fruits.green_apple(size, price_factor=1.2)
fruits = [ green_apple(3), cheap_green_apple(3) ]
我还没有找到任何方法来实现这一点。我明白为什么这是一个问题:第二个静态方法不能在类存在之前调用第一个静态方法,并且类不能在fruits
字段尚未构建之前存在。但是,在类存在之前,一个静态方法不能调用另一个静态方法是没有逻辑原因的。方法的作用域在类内部,它们不使用类的任何东西;因此,在上面的示例中,字段fruits
的构建仍然有效。
这些方法应该被 Package 在 Package 器类Fruits
中,因为该类的用户也应该使用它们。把它们放在类之前(并在类中重复它们)是一个丑陋的解决方案,但它会使外部范围变得混乱,因此我想避免这种情况。
所以我的问题不是为什么会这样。我要求聪明的解决方案来实现我想要的:几个fruit类(Apple
等)和一个 Package 类(Fruits
),用于提供我的场景中的所有fruit,而不会扰乱外部范围,同时在 Package 类中使用一组嵌套的助手函数。
是否有实现这一目标的选择?我尝试了几个静态和类方法的变体,但还没有任何效果。
1条答案
按热度按时间twh00eeo1#
这看起来像一个工厂模式的案例。
一个简单的解决方案是从Fruits数据保持器中删除对象创建,并将其放入一个专用类,即工厂。
一个可能的(快速编写的)解决方案可能是: