python 在生成类时使用嵌套的帮助器函数

uxhixvfz  于 2023-06-20  发布在  Python
关注(0)|答案(1)|浏览(103)

我想构建一个类,它仅仅是一些数据的 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 类中使用一组嵌套的助手函数。
是否有实现这一目标的选择?我尝试了几个静态和类方法的变体,但还没有任何效果。

twh00eeo

twh00eeo1#

这看起来像一个工厂模式的案例。
一个简单的解决方案是从Fruits数据保持器中删除对象创建,并将其放入一个专用类,即工厂。
一个可能的(快速编写的)解决方案可能是:

from dataclasses import dataclass

@dataclass
class Apple:
    color: str
    size: float
    price: float

class FruitFactory:
    @staticmethod
    def green_apple(size, price_factor=2.5):
        return Apple(color="green", size=size, price=price_factor)

class Fruits:
    def __init__(self):
        self.fruits = [FruitFactory.green_apple(1)]
    

fruits = Fruits()
print(fruits.fruits)

相关问题