- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
为了以更 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/
我使用的是 PHP 5.3 稳定版,有时会遇到非常不一致的行为。据我所知,在继承中,父类(super class)中的所有属性和方法(私有(private)、公共(public)和 protected
所以我一直在努力寻找正确的方法来让应该非常简单的继承发挥作用(以我想要的方式 ;)),但我失败得很惨。考虑一下: class Parent { public String name = "Pare
给定这些类: class Father { public Father getMe() { return this; } } class Child extends Father {
为什么最后打印“I'm a Child Class”。 ? public class Parent { String parentString; public Parent()
我知道有很多类似的问题对此有很多很好的答案。我试着看看经典的继承方法,或者那些闭包方法等。不知何故,我认为它们对我来说或多或少是“hack”方法,因为它并不是 javascript 设计的真正目的。
我已经使用表单继承有一段时间了,但没有对以下方法进行太多研究。只需创建一个新类而不是表单并从现有表单继承并根据需要将所需控件转换为 protected 。 Visual Studio 2010 设计器
我原以为下面的代码片段会产生编译错误,因为派生类不会有我试图在 pub_fun() 中访问的 priv_var。但是它编译了,我得到了下面提到的输出。有人可以解释这背后的理论吗? class base
继承的替代方案有哪些? 最佳答案 Effective Java:优先考虑组合而不是继承。 (这实际上也来自《四人帮》)。 他提出的情况是,如果扩展类没有明确设计为继承,继承可能会导致许多不恰当的副作用
我有2个类别:动物( parent )和狗(动物的“ child ”),当我创建一个 Animal 对象并尝试提醒该动物的名称时,我得到了 undefined ,而不是她的真名。为什么?(抱歉重复发帖
我试图做继承,但没想到this.array会像静态成员一样。我怎样才能让它成为“ protected /公开的”: function A() { this.array = []; } func
在创建在父类中使用的 lambda 时,我试图访问子类方法和字段。代码更容易解释: class Parent { List> processors; private void do
如果我有一个对象,我想从“ super 对象”“继承”方法以确保一致性。它们将是混合变量。 修订 ParentObj = function() { var self = this; t
class Base { int x=1; void show() { System.out.println(x); } } class Chi
目前我正在尝试几种不同的 Javascript 继承方法。我有以下代码: (“借用”自 http://www.kevlindev.com/tutorials/javascript/inheritanc
我在 .popin-foto 元素中打开一个 popin。当我尝试在同一元素中打开子类 popin 时,它不起作用。 代码 这是 parent function Popin(container, ti
我有以下两个类: class MyClass { friend ostream& operatorvalue +=1; return *this; } 现在
有没有办法完全忽略导入到 html 文件中的 header 中的 CSS 文件? 我希望一个页面拥有自己独立的 CSS,而不是从任何其他 CSS 源继承。 最佳答案 您可以在本地样式表中使用 !imp
Douglas Crockford似乎喜欢下面的继承方式: if (typeof Object.create !== 'function') { Object.create = functio
假设我有以下代码: interface ISomeInterface { void DoSomething(); void A(); void B(); } public
class LinkedList{ public: int data; LinkedList *next; }; class NewLinkedList: public Lin
我是一名优秀的程序员,十分优秀!