相关疑难解决方法(0)

使用__init __()方法理解Python super()

我正在努力了解它的用法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 oop inheritance class super

2366
推荐指数
7
解决办法
158万
查看次数

Python中的旧样式和新样式类有什么区别?

Python中的旧样式和新样式类有什么区别?我什么时候应该使用其中一种?

python oop types class new-style-class

953
推荐指数
8
解决办法
22万
查看次数

使用多重继承调用父类__init__,这是正确的方法吗?

假设我有一个多继承场景:

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__:

  1. (老式) ParentClass.__init__(self)
  2. (新样式) super(DerivedClass, self).__init__()

但是,在任何一种情况下,如果父类(AB)不遵循相同的约定,则代码将无法正常工作(某些可能会被遗漏,或被多次调用).

那么又是什么样的正确方法呢?很容易说"只是保持一致,遵循一个或另一个",但如果AB来自第三方图书馆,那么呢?有没有一种方法可以确保所有父类构造函数被调用(并且以正确的顺序,只有一次)?

编辑:看看我的意思,如果我这样做:

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)

python oop inheritance multiple-inheritance super

138
推荐指数
4
解决办法
6万
查看次数

Python:在__getitem__中实现切片

我正在尝试为我正在创建的类创建切片功能,以创建矢量表示.

到目前为止我有这个代码,我相信它会正确地实现切片,但每当我做一个调用,就像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 slice python-datamodel

99
推荐指数
5
解决办法
6万
查看次数

新式课程中的方法解决顺序(MRO)?

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.

python method-resolution-order

86
推荐指数
3
解决办法
5万
查看次数

我如何从一个类访问变量到另一个类?

我正在编写一个利用多个类的程序.我有一个专门用于确定一组变量值的类.然后,我希望能够使用其他类访问这些变量的值.我的代码如下:

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的值?

python variables class

27
推荐指数
2
解决办法
10万
查看次数

Python类继承:AttributeError:'[SubClass]'对象没有属性'xxx'

我有以下基类和子类:

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属性?

python inheritance class-attributes

20
推荐指数
1
解决办法
3万
查看次数

Python继承 - 在子类中调用基类方法?

令我感到困惑的是,我无法在任何地方找到明确的解释.为什么以及何时需要在子类的同名方法中调用基类的方法?

class Child(Base):
    def __init__(self):
        Base.__init__(self)

    def somefunc(self):
        Base.somefunc(self)
Run Code Online (Sandbox Code Playgroud)

当你不想完全覆盖基类中的方法时,我猜你这样做了.是真的有它的全部吗?

python inheritance class overwrite base-class

16
推荐指数
2
解决办法
2万
查看次数

从子类实例访问父类实例属性?

如何在此代码示例中从"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)

python class parent instance

11
推荐指数
3
解决办法
3万
查看次数

Python3 - TypeError:module .__ init __()最多需要2个参数(给定3个)

请不要标记为重复,其他类似的问题没有解决我的问题.

这是我的设置

/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 python-3.x

9
推荐指数
1
解决办法
2万
查看次数