我正在努力了解它的用法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) Python中的旧样式和新样式类有什么区别?我什么时候应该使用其中一种?
假设我有一个多继承场景:
class A(object):
# code for A here
class B(object):
# code for B here
class C(A, B):
def __init__(self):
# What's the right code to write here to ensure
# A.__init__ and B.__init__ get called?
Run Code Online (Sandbox Code Playgroud)
有写作两种典型的方法C
的__init__
:
ParentClass.__init__(self)
super(DerivedClass, self).__init__()
但是,在任何一种情况下,如果父类(A
和B
)不遵循相同的约定,则代码将无法正常工作(某些可能会被遗漏,或被多次调用).
那么又是什么样的正确方法呢?很容易说"只是保持一致,遵循一个或另一个",但如果A
或B
来自第三方图书馆,那么呢?有没有一种方法可以确保所有父类构造函数被调用(并且以正确的顺序,只有一次)?
编辑:看看我的意思,如果我这样做:
class A(object):
def __init__(self):
print("Entering A")
super(A, self).__init__()
print("Leaving A")
class B(object):
def __init__(self):
print("Entering B")
super(B, self).__init__()
print("Leaving B")
class …
Run Code Online (Sandbox Code Playgroud) 我正在尝试为我正在创建的类创建切片功能,以创建矢量表示.
到目前为止我有这个代码,我相信它会正确地实现切片,但每当我做一个调用,就像v[4]
v是一个向量python返回一个关于没有足够的参数的错误.所以我试图弄清楚如何getitem
在我的类中定义特殊方法来处理普通索引和切片.
def __getitem__(self, start, stop, step):
index = start
if stop == None:
end = start + 1
else:
end = stop
if step == None:
stride = 1
else:
stride = step
return self.__data[index:end:stride]
Run Code Online (Sandbox Code Playgroud) 在Python in a Nutshell(第2版)一书中,有一个示例使用
旧样式类来演示如何以经典分辨率顺序解析方法,
以及它与新顺序的不同之处.
我通过重写新样式的示例尝试了相同的示例,但结果与使用旧样式类获得的结果没有什么不同.我用来运行该示例的python版本是2.5.2.以下是示例:
class Base1(object):
def amethod(self): print "Base1"
class Base2(Base1):
pass
class Base3(object):
def amethod(self): print "Base3"
class Derived(Base2,Base3):
pass
instance = Derived()
instance.amethod()
print Derived.__mro__
Run Code Online (Sandbox Code Playgroud)
调用instance.amethod()
打印Base1
,但根据我对MRO的理解,新类型的输出应该是Base3
.通话Derived.__mro__
打印:
(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)
我不确定我对新样式类的MRO的理解是不正确的还是我做了一个我无法察觉的愚蠢错误.请帮助我更好地了解MRO.
我正在编写一个利用多个类的程序.我有一个专门用于确定一组变量值的类.然后,我希望能够使用其他类访问这些变量的值.我的代码如下:
class ClassA(object):
def __init__(self):
self.var1 = 1
self.var2 = 2
def methodA(self):
self.var1 = self.var1 + self.var2
return self.var1
class ClassB(ClassA):
def __init__(self):
self.var1 = ?
self.var2 = ?
object1 = ClassA()
sum = object1.methodA()
print sum
Run Code Online (Sandbox Code Playgroud)
我使用classA初始化2个变量(var1和var2).然后我使用methodA来添加它们,将结果保存为var1(我认为这将使var1 = 3和var2 = 2).我想知道的是,如何让ClassB能够从ClassA获取var1和var2的值?
我有以下基类和子类:
class Event(object):
def __init__(self, sr1=None, foobar=None):
self.sr1 = sr1
self.foobar = foobar
self.state = STATE_NON_EVENT
# Event class wrappers to provide syntatic sugar
class TypeTwoEvent(Event):
def __init__(self, level=None):
self.sr1 = level
self.state = STATE_EVENT_TWO
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我正在检查TypeTwoEvent类的实例,检查我知道在基类中存在的字段 - 我希望它默认值为None.但是,我的代码引发了以下异常:
AttributeError:'TypeTwoEvent'对象没有属性'foobar'
我的印象是基类字段将由子类继承,并且创建子类的实例将实例化基类(从而调用其构造函数)...
我在这里失踪了什么?为什么TypeTwoEvent
没有一个None
属性-当其所来源的基本类有一个TypeTwoEvent
属性?
令我感到困惑的是,我无法在任何地方找到明确的解释.为什么以及何时需要在子类的同名方法中调用基类的方法?
class Child(Base):
def __init__(self):
Base.__init__(self)
def somefunc(self):
Base.somefunc(self)
Run Code Online (Sandbox Code Playgroud)
当你不想完全覆盖基类中的方法时,我猜你这样做了.是真的有它的全部吗?
如何在此代码示例中从"child"访问"myvar":
class Parent():
def __init__(self):
self.myvar = 1
class Child(Parent):
def __init__(self):
Parent.__init__(self)
# this won't work
Parent.myvar
child = Child()
Run Code Online (Sandbox Code Playgroud) 请不要标记为重复,其他类似的问题没有解决我的问题.
这是我的设置
/main.py
/actions/ListitAction.py
/actions/ViewAction.py
Run Code Online (Sandbox Code Playgroud)
Main.py:
from actions import ListitAction, ViewAction
Run Code Online (Sandbox Code Playgroud)
ListitAction.py:
class ListitAction(object):
def __init__(self):
#some init behavior
def build_uri():
return "test.uri"
Run Code Online (Sandbox Code Playgroud)
ViewAction.py
from actions import ListitAction
class ViewAction(ListitAction):
def __init__(self, view_id):
ListitAction.__init__(self)
self.view_id = view_id
def build_uri():
return "test"
Run Code Online (Sandbox Code Playgroud)
运行:
$ python3 main.py
Run Code Online (Sandbox Code Playgroud)
我收到的唯一错误消息是:
Traceback (most recent call last):
File "/home/jlevac/workspace/project/listit.py", line 11, in <module>
from actions import ListitAction, ViewAction, CommentsAction
File "/home/jlevac/workspace/project/actions/ViewAction.py", line 3, in <module>
class ViewAction(ListitAction):
TypeError: module.__init__() takes at most 2 arguments (3 given) …
Run Code Online (Sandbox Code Playgroud) python ×10
class ×5
inheritance ×4
oop ×3
super ×2
base-class ×1
instance ×1
overwrite ×1
parent ×1
python-3.x ×1
slice ×1
types ×1
variables ×1