我正在努力了解它的用法super()
.从它的外观来看,可以创建两个子类,就好了.
我很想知道以下2个孩子班级之间的实际差异.
class Base(object):
def __init__(self):
print "Base created"
class ChildA(Base):
def __init__(self):
Base.__init__(self)
class ChildB(Base):
def __init__(self):
super(ChildB, self).__init__()
ChildA()
ChildB()
Run Code Online (Sandbox Code Playgroud) 为什么喜欢构图而不是继承呢?每种方法都有哪些权衡取舍?什么时候应该选择继承而不是作文?
如果我从一个基类继承并希望将继承类的构造函数中的某些东西传递给基类的构造函数,我该怎么做?
例如,
如果我从Exception类继承,我想做这样的事情:
class MyExceptionClass : Exception
{
public MyExceptionClass(string message, string extraInfo)
{
//This is where it's all falling apart
base(message);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我想要的是能够将字符串消息传递给基本的Exception类.
在规划我的程序时,我经常从一连串的想法开始:
足球队只是一个足球运动员名单.因此,我应该代表它:
Run Code Online (Sandbox Code Playgroud)var football_team = new List<FootballPlayer>();
此列表的顺序表示球员在名单中列出的顺序.
但我后来才意识到,除了仅仅是球员名单之外,球队还有其他属性,必须记录下来.例如,本赛季的总得分,当前预算,统一颜色,string
代表球队名称等等.
那么我认为:
好吧,足球队就像一个球员名单,但另外,它有一个名称(a
string
)和一个总分(aint
)..NET不提供用于存储足球队的类,所以我将创建自己的类.最相似和相关的现有结构是List<FootballPlayer>
,所以我将继承它:Run Code Online (Sandbox Code Playgroud)class FootballTeam : List<FootballPlayer> { public string TeamName; public int RunningTotal }
但事实证明,指南说你不应该继承List<T>
.我在两个方面完全被这个指南搞糊涂了.
显然List
是以某种方式针对性能进行了优化.怎么会这样?如果我延长会给我带来什么性能问题List
?究竟会打破什么?
我看到的另一个原因List
是微软提供的,我无法控制它,所以我在以后暴露"公共API"后无法改变它.但我很难理解这一点.什么是公共API,我为什么要关心?如果我当前的项目没有并且不太可能拥有此公共API,我可以放心地忽略此指南吗?如果我继承List
并且事实证明我需要一个公共API,那么我将遇到什么困难?
为什么它甚至重要?列表是一个列表.什么可能改变?我可能想要改变什么?
最后,如果微软不想让我继承List
,他们为什么不上课sealed
呢?
显然,对于自定义集合,Microsoft提供了一个Collection
应该扩展的类而不是List
.但这个类是非常裸露,并没有多少有用的东西,比如AddRange
,例如.jvitor83的答案提供了该特定方法的性能原理,但是如何缓慢AddRange
而不是没有AddRange
?
继承Collection
是比继承更多的工作List
,我认为没有任何好处.当然微软不会告诉我无缘无故地做额外的工作,所以我不禁觉得我在某种程度上误解了某些东西,而继承Collection
实际上并不是解决我问题的正确方法.
我见过如实施的建议IList …
这两个代码片段之间有什么区别?使用type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Run Code Online (Sandbox Code Playgroud)
使用isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Run Code Online (Sandbox Code Playgroud) 是否有任何理由要继承类声明object
?
我刚刚发现了一些代码,我找不到一个很好的理由.
class MyClass(object):
# class code follows...
Run Code Online (Sandbox Code Playgroud) 该API参考范围页面说:
范围可以从父范围继承.
该开发者指南范围页说:
范围(原型)从其父范围继承属性.
那么,子范围是否始终从其父范围继承原型?有例外吗?当它继承时,它是否总是正常的JavaScript原型继承?
javascript inheritance prototype prototypal-inheritance angularjs
是什么区别public
,private
以及protected
用C++继承?我在SO上发现的所有问题都涉及具体案例.
如何设置代表接口的类?这只是一个抽象的基类吗?
我对Java泛型如何处理继承/多态性感到困惑.
假设以下层次结构 -
动物(父母)
狗 - 猫(儿童)
所以假设我有一个方法doSomething(List<Animal> animals)
.根据所有继承和多态的规则,我会假设a List<Dog>
是 a List<Animal>
而a List<Cat>
是 a List<Animal>
- 所以任何一个都可以传递给这个方法.不是这样.如果我想实现这种行为,我必须明确告诉该方法接受一个Animal的任何子类的列表doSomething(List<? extends Animal> animals)
.
我知道这是Java的行为.我的问题是为什么?为什么多态通常是隐含的,但是当涉及泛型时必须指定它?
inheritance ×10
oop ×5
python ×3
c# ×2
c++ ×2
class ×2
.net ×1
aggregation ×1
angularjs ×1
c++-faq ×1
composition ×1
constructor ×1
generics ×1
interface ×1
java ×1
javascript ×1
list ×1
object ×1
polymorphism ×1
prototype ×1
pure-virtual ×1
super ×1
types ×1