是否有任何理由要继承类声明object?
我刚刚发现了一些代码,我找不到一个很好的理由.
class MyClass(object):
# class code follows...
Run Code Online (Sandbox Code Playgroud) Python中的旧样式和新样式类有什么区别?我什么时候应该使用其中一种?
我是Python面向对象编程的新手,我很难理解super()函数(新样式类),尤其是涉及多重继承时.
例如,如果你有类似的东西:
class First(object):
def __init__(self):
print "first"
class Second(object):
def __init__(self):
print "second"
class Third(First, Second):
def __init__(self):
super(Third, self).__init__()
print "that's it"
Run Code Online (Sandbox Code Playgroud)
我没有得到的是:Third()该类是否会继承构造函数方法?如果是,那么将使用super()运行哪一个?为什么?
如果你想运行另一个怎么办?我知道它与Python方法解析顺序(MRO)有关.
在Python中创建一个简单的对象层次结构时,我希望能够从派生类中调用父类的方法.在Perl和Java中,有一个关键字this(super).在Perl中,我可能会这样做:
package Foo;
sub frotz {
return "Bamf";
}
package Bar;
@ISA = qw(Foo);
sub frotz {
my $str = SUPER::frotz();
return uc($str);
}
Run Code Online (Sandbox Code Playgroud)
在python中,似乎我必须从子级明确命名父类.在上面的例子中,我必须做类似的事情Foo::frotz().
这似乎不对,因为这种行为使得很难制作深层次结构.如果孩子需要知道哪个类定义了一个继承的方法,那么就会产生各种各样的信息痛苦.
这是python中的实际限制,是我理解中的差距还是两者兼而有之?
有什么区别:
class Child(SomeBaseClass):
def __init__(self):
super(Child, self).__init__()
Run Code Online (Sandbox Code Playgroud)
和:
class Child(SomeBaseClass):
def __init__(self):
SomeBaseClass.__init__(self)
Run Code Online (Sandbox Code Playgroud)
我已经看到super在只有单继承的类中使用了很多.我可以看到为什么你在多重继承中使用它,但不清楚在这种情况下使用它的优点是什么.
我目前有一些单元测试,它们共享一组共同的测试.这是一个例子:
import unittest
class BaseTest(unittest.TestCase):
def testCommon(self):
print 'Calling BaseTest:testCommon'
value = 5
self.assertEquals(value, 5)
class SubTest1(BaseTest):
def testSub1(self):
print 'Calling SubTest1:testSub1'
sub = 3
self.assertEquals(sub, 3)
class SubTest2(BaseTest):
def testSub2(self):
print 'Calling SubTest2:testSub2'
sub = 4
self.assertEquals(sub, 4)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
以上的输出是:
Calling BaseTest:testCommon
.Calling BaseTest:testCommon
.Calling SubTest1:testSub1
.Calling BaseTest:testCommon
.Calling SubTest2:testSub2
.
----------------------------------------------------------------------
Ran 5 tests in 0.000s
OK
Run Code Online (Sandbox Code Playgroud)
有没有办法重写上面的内容,以便第一个testCommon不被调用?
编辑: 我没有运行上面的5个测试,而是希望它只运行4个测试,2个来自SubTest1,另外2个来自SubTest2.似乎Python unittest自己运行原始的BaseTest,我需要一种机制来防止这种情况发生.
我是python的初学者.我无法理解继承和__init__().
class Num:
def __init__(self,num):
self.n1 = num
class Num2(Num):
def show(self):
print self.n1
mynumber = Num2(8)
mynumber.show()
Run Code Online (Sandbox Code Playgroud)
结果: 8
还行吧.但我换成Num2了
class Num2(Num):
def __init__(self,num):
self.n2 = num*2
def show(self):
print self.n1,self.n2
Run Code Online (Sandbox Code Playgroud)
结果: Error. Num2 has no attribute "n1".
在这种情况下,如何Num2访问n1?
我有两个A和B类,A是B的基类.
我读到Python中的所有方法都是虚拟的.
那么我如何调用基类的方法,因为当我尝试调用它时,派生类的方法按预期调用?
>>> class A(object):
def print_it(self):
print 'A'
>>> class B(A):
def print_it(self):
print 'B'
>>> x = B()
>>> x.print_it()
B
>>> x.A ???
Run Code Online (Sandbox Code Playgroud) 下面的代码示例,可以super使用,或者C有来电A.foo和B.foo明确?
class A(object):
def foo(self):
print 'A.foo()'
class B(object):
def foo(self):
print 'B.foo()'
class C(A, B):
def foo(self):
print 'C.foo()'
A.foo(self)
B.foo(self)
Run Code Online (Sandbox Code Playgroud) 短版(tl; dr)
我正在学习PySide,大多数在线教程都super用来初始化UI元素.这是重要的(即,更具可扩展性),还是品味问题?
澄清:当我在详细版本中更清楚时,这不是另一个通知线程,询问何时使用super(这已经在之前完成).相反,考虑到使用PySide教程的数量super,而不是<class>.__init__,我想如果用弄清楚super是PySide应用程序的标准?如果是这样,是因为super在使用PySide/PyQt时需要特别提到的(涉及解决继承问题)?或者这是品味问题.
详细版本
我是Python的新手,目前正在使用Zets教程学习PySide(http://zetcode.com/gui/pysidetutorial/firstprograms/).本教程的第二个示例包括:
from PySide import QtGui
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(300,300,250,150)
self.setWindowTitle("PySide 101: Window the First!")
self.show()
app=QtGui.QApplication(sys.argv)
ex=Example()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我从未使用过super.因此,我重写了上面的代码,成功地替换super了父类的更标准的显式调用:
QtGui.QWidget.__init__(self)
Run Code Online (Sandbox Code Playgroud)
但是,当我在网上搜索PySide教程时(例如,http://qt-project.org/wiki/PySide-Newbie-Tutorials ),它们都包括调用super.我的问题是:我应该super用于PySide脚本吗?
看来,super当你有继承的钻石,它倾向于解决多重继承的情况下,以合理的方式似乎是最有帮助的.是否super与PySide一起使用,因为这些钻石的案例占优势,我会面对更现实的复杂例子?[编辑:否:请参阅下面的答案.]
我为什么要问?为什么不直接使用super并完成它?
我在问,因为我用来学习Python的书(学习Python,由Lutz撰写)花了20多页关于这个主题super,并明确告诫不要使用它.他建议新的Python用户在使用它之前采用更传统,更明确的路线(例如,参见第832页,学习Python的第1041-1064页,第5版).他基本上将它描绘成一种非剧性的,神秘的,很少需要的新风格,刚开始时你应该非常谨慎地对待它,并认为它被有经验的用户过度使用.
此外,查看两个主要的PySide/PyQt项目(Spyder和pyqtgraph)的源代码,两者都没有使用super.One(Spyder)明确告诉贡献者出于兼容性原因而避免使用它(http://code.google.com/p/spyderlib/wiki/NoteForContributors). …