gpt4 book ai didi

继承许多类的 Pythonic 方式?

转载 作者:太空狗 更新时间:2023-10-30 02:04:12 24 4
gpt4 key购买 nike

为了以更 Python 和 OOP 风格的方式编写代码,我想知道是否有人可以建议我实现这个概念。

假设我有一个水果基类,比如苹果和香蕉,其中包含该类的基本属性,例如颜色。然后我想继承自名为 juice 的水果的类,它添加了方法和属性,例如体积, 糖.

粗略的结构可能是:

class Fruit(object):
def __init__(self, fruit_name):
if fruit_name == 'apple':
self.color = 'green'
self.sugar_content = 2
elif fruit_name == 'banana':
self.color = 'yellow'
self.sugar_content = 3

然后我继承了我的 Fruit 类的方法:

class Juice(Fruit):
def __init___(self, fruit_name, volume, additives):
PERHAPS I NEED TO USE A SUPER STATEMENT HERE TO PASS THE fruit_name parameter (which is 'apple' or 'banana' BACK TO THE FRUIT CLASS? I want this class to be able to access sugar_content and color of the the fruit class.
self.volume = volume
self.additives = additives

def calories(self, sugar_added):
return sugar_added + 2*self.sugar_content* self.volume # i.e. some arbitrary function using the class parameters of both this juice class and the original fruit class

所以最终,我可以创建一个像这样的对象:

my_juice = Juice(fruit_name='apple', volume=200, additives='sugar,salt')
print 'My juice contains %f calories' % self.calories(sugar_added=5)
print 'The color of my juice, based on the fruit color is %s' % self.color

或者,我想知道是否完全不继承并简单地从 Juice 类调用水果类是否更好。例如

class Juice(object):
def __init__(self, fruit_name, volume, additives):
self.fruit = Fruit(fruit_name=fruit_name)
self.volume = volume # ASIDE: is there an easier way to inherit all parameters from a init call and make them into class variables of the same name and accessible by self.variable_name calls?
self.additives = additives

def calories(self, sugar_added):
return sugar_added + 2*self.fruit.sugar_content* self.volume

在某些方面,上面的内容感觉更自然,因为 self.Fruit.sugar_content 直接表明 sugar_content 是水果的属性。而如果我继承,那么我会使用 self.sugar_content,这是水果的一个属性,尽管可能会与依赖于其他因素的果汁类的糖含量相混淆。

或者,最好还是为每个水果有一个单独的类,并在 Juice 类 init 中放置逻辑语句来评估传递给 Juice 类的 fruit_name 字符串,然后使用例如:

class Apple(object):
self.color = 'green'

class Banana(object):
self.color = 'yellow'

class Juice(object):
def __init__(self, fruit_name, other params):
if fruit_name == 'apple':
self.Fruit = Apple
self.sugar_content=2
elif fruit_name == 'banana':
self.Fruit = Banana
self.sugar_content=3
# Or some easier way to simply say
self.Fruit = the class which has the same name as the string parameter fruit_name

虽然我正在寻找开发高效编码风格的建议,但我很欣赏以上所有内容在理论上都可行。在实践中,我想将其应用于不涉及水果的更复杂的项目,尽管该示例涵盖了我面临的许多问题。

欢迎所有建议/提示/建议阅读链接。谢谢。

最佳答案

我认为您的第一个选择最接近于一个好主意,但这里有一个改进:

class Fruit:

def __init__(self, name, sugar_content):
self.name = name
self.sugar_content = sugar_content

现在,确定每个 Fruit 包含多少糖的逻辑完全移到了类定义之外。它可以去哪里?一种选择是子类化:

class Apple(Fruit):

def __init__(self):
super().__init__("apple", 2)

或者,如果 Fruit 之间的唯一区别是名称和含糖量,只需创建实例并输入数据(例如来自文件):

apple = Fruit("apple", 2)

现在 Juice 怎么样。这是 Fruit 组成,但实际上它本身并不是Fruit,因此继承不太合适。尝试:

class Juice:

def __init__(self, fruits):
self.fruits = fruits

@property
def sugar_content(self):
return sum(fruit.sugar_content for fruit in self.fruits)

您可以传递一个可迭代的 Fruit 实例来制作一个 Juice:

>>> mixed_fruit = Juice([Fruit("apple", 2), Fruit("banana", 3)])
>>> mixed_fruit.sugar_content
5

然后您可以扩展它以包含以下想法:

  • 每个Fruit有多少进入Juice
  • Juice 的体积是多少(根据成分计算的另一个 @property?);和
  • 存在哪些添加剂(水、糖等)。

以一致的比例单位工作是明智的,例如sugar_content 每克 Fruit 的糖分克数(即百分比)。

关于继承许多类的 Pythonic 方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23111084/

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