【问题标题】:How to properly extend other classes in Python? (python v3.3)如何正确扩展 Python 中的其他类? (蟒蛇v3.3)
【发布时间】:2012-07-21 21:03:38
【问题描述】:

过去几天我开始学习 python,在探索面向对象编程时遇到了问题。 我在运行 pydev 插件时使用 Eclipse,在 python 3.3 beta 上运行,并且使用的是 windows 64 位系统。

我可以很好地初始化一个类并使用其中的任何方法,只要我不尝试扩展超类(我在不同的源文件中编码的每个类) 例如,下面的代码编译运行良好。

class pythonSuper:
    string1 = "hello"
    def printS():
        print pythonSuper.string1

以及访问和运行它的代码...

from stackoverflow.questions import pythonSuper
class pythonSub:
    pysuper = pythonSuper.pythonSuper()
    pysuper.printS()

就像我说的,这行得通。以下代码没有

class pythonSuper: """Same superclass as above. unmodified, except for the spacing"""
string1 = "hello"
def printS(self):
    print(pythonSuper.string1)

嗯,这并不完全正确。至少据我所知,超类绝对没问题。奇怪的是子类

from stackoverflow.questions import pythonSuper
class pythonSub(pythonSuper):
    pass

pythonObject = pythonSub()
pythonSub.pythonSuper.printS()

当子类运行时 Eclipse 会打印出这个错误

Traceback (most recent call last):
   File "C:\Users\Anish\workspace\Python 3.3\stackoverflow\questions\pythonSub.py",           
   line 7, in <module>
class pythonSub(pythonSuper):
TypeError: module.__init__() takes at most 2 arguments (3 given)

我不知道发生了什么。我一直在从 thenewboston 的教程中学习 python,但是那些已经过时了(我认为他的教程代码使用了 python 2.7 版)。他还在 IDLE 中编码,这意味着他的类都包含在一个文件中。然而,我的都编码在自己的文件中。这意味着我不知道我得到的代码错误是由于过时的语法还是我对这种语言缺乏知识的结果。但我离题了。如果有人可以回复解决方案和/或解释代码出错的原因以及我可以做些什么来解决它。最好有解释。我宁愿知道我做错了什么,这样我就可以避免和解决类似情况下的问题,而不仅仅是复制和粘贴一些代码并查看它是否有效。 谢谢,期待您的回答

【问题讨论】:

    标签: python oop class


    【解决方案1】:

    我运行了您的代码,尽管进行了一些修改,但它运行良好。这是我的代码:

    python超级:

    class pythonSuper:
        string1 = 'hello'
        def printS(self):
            print(self.string1)
    

    主要:

    from pythonSuper import pythonSuper as pySuper
    
    class pythonSub(pySuper):
        pass
    
    pythonObject = pythonSub()
    pythonObject.printS()
    

    注意:我对您的代码所做的更改如下:

    在您的代码中,您编写了pythonSub.pythonSuper.printS(),这是不正确的,因为通过pythonSub,您已经支持直接从超类继承的printS() 方法。因此,无需在该语句中显式引用超类。我用来代替上述声明的声明 pythonObject.printS() 似乎已经解决了这个问题。

    【讨论】:

    • 这给了我错误 Traceback(最近一次调用最后一次):文件“C:\Users\Anish\workspace\Python 3.3\stackoverflow\questions\pythonSub.py”,第 8 行,在 class pythonSub(pySuper): TypeError: module.__init__() 最多接受 2 个参数(给定 3 个) 我尝试复制和粘贴代码(使用我自己的包名),但结果是上述错误。我开始认为这是 python 3.3 语法的事情,因为两个解决方案已经失败(从某种意义上说程序运行不正确),但我可能完全偏离了标记
    • 请把代码和错误贴出来让我能更好地帮助你。我相信这可能是您在代码版本上犯的错误,我在 python 3.3 上编写了上面的内容,效果很好!
    【解决方案2】:

    pythonSuper 指的是模块,而不是类。

    class pythonSub(pythonSuper.pythonSuper): 
        pass
    

    【讨论】:

    • 谢谢,但现在它发布了这个错误 Traceback(最近一次调用最后一次):文件“C:\Users\Anish\workspace\Python 3.3\stackoverflow\questions\pythonSub.py”,第 11 行,在 pythonSub.pythonSuper.printS() AttributeError: type object 'pythonSub' has no attribute 'pythonSuper' 我不想纠缠任何人,但有什么原因吗?
    • 你为什么会期望它? pythonSub 正在扩展 pythonSuper,而不是包含它。 printS 是继承的,你可以通过你的 pythonSub 实例直接访问它。
    • @DanielRoseman 很抱歉,这让我有点不知所措。你能用,嗯,菜鸟语言解释一下吗? (或者,您可以将我链接到我可以学习所有这些内容的页面)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多