python初始化父类错误

源码如下:

#!/usr/bin/env python

class Bird():
        def __init__(self):
                self.hungry = True

        def eat(self):
                if self.hungry:
                        print ‘Aaaah...‘
                        self.hungry = False
                else:
                        print ‘No, Thanks!‘

class SongBird(Bird):
        def __init__(self):
                super(SongBird, self).__init__()
       #       Bird.__init__(self)
                self.sound = ‘Squawk!‘

        def sing(self):
                print self.sound

错误信息如下:

>>> from Bird import Bird, SongBird
>>> b = Bird()
>>> b.eat()
Aaaah...
>>> b.eat()
No, Thanks!
>>> sb = SongBird()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "Bird.py", line 17, in __init__
    super(SongBird, self).__init__()
TypeError: must be type, not classobj

错误原因:

使用super初始化父类只对父类为新风格(new-style)的生效,对旧风格的不生效。

解决方式1:

#!/usr/bin/env python

# 使用new-style
class Bird(object):
        def __init__(self):
                self.hungry = True

        def eat(self):
                if self.hungry:
                        print ‘Aaaah...‘
                        self.hungry = False
                else:
                        print ‘No, Thanks!‘

class SongBird(Bird):
        def __init__(self):
                super(SongBird, self).__init__()
                self.sound = ‘Squawk!‘

        def sing(self):
                print self.sound

解决方法2:

#!/usr/bin/env python

__metaclass__ = type

class Bird:
        def __init__(self):
                self.hungry = True

        def eat(self):
                if self.hungry:
                        print ‘Aaaah...‘
                        self.hungry = False
                else:
                        print ‘No, Thanks!‘

class SongBird(Bird):
        def __init__(self):
                super(SongBird, self).__init__()
                self.sound = ‘Squawk!‘

        def sing(self):
                print self.sound

解决方法3(使用old-style):

#!/usr/bin/env python

class Bird():
        def __init__(self):
                self.hungry = True

        def eat(self):
                if self.hungry:
                        print ‘Aaaah...‘
                        self.hungry = False
                else:
                        print ‘No, Thanks!‘

class SongBird(Bird):
        def __init__(self):
                # 不使用super进行初始化
                Bird.__init__(self)
                self.sound = ‘Squawk!‘

        def sing(self):
                print self.sound

python初始化父类错误

时间: 2024-10-18 03:17:19

python初始化父类错误的相关文章

Python学习_07_错误、异常

地毯式地过语法终于快要结束了... Python中的常见异常 1.NameError:尝试访问一个未初始化的变量 2. ZeroDivisionError:除数为0 3. SyntaxError:Python解释器语法错误 4. IndexError:请求的索引超出序列的范围 5. KeyError:请求一个不存在的字典关键字 6. IOError:输入.输出错误 7. AttributeError:尝试访问未知的对象属性 等,这些错误都是来自于Exception类,Exception类和Sys

Python学习-16.Python中的错误处理

虽然叫错误,但跟 C# 中的异常是一回事.只不过 Python 中叫错误(Error)而 C# 中叫异常(Exception). 先手工产生一个异常: 1 file = open('','r') 上面一句由于路径是空路径,因此文件肯定是不存在的,执行这一句会引发 FileNotFoundError 这个错误. 既然是错误的,程序也停止了,这是我们不希望的,因此得想办法处理一下. 在 Python 中,异常处理使用 try.except.finally 这三个关键字. 修改代码如下: 1 path

Python中父类和子类间类属性(非实例属性)的设置获取的传递

前几天做一个项目,遇见类似这样一个问题.父类是个公用类,很多子项目中都运用到了,而子类也要作为一个基本类在该项目中的很多地方都要用到,但是的原始父类里面有些类属性(注意这里是类属性,不是实力属性).在程序运行时候要进行重新设置. 背景:Python中父类的类属性,类方法,实力属性都能够被子类继承,实力属性的再设置很简单,当然为了控制类属性的访问权限(Python中不能完全实现控制),也可以用@preproty装饰符优化和控制实力属性的设置,父类的类属性被子类继承,可以很容易的获得父类属性的内容,

Python Solve UnicodeEncodeError &#39;gbk&#39; / &#39;ascii&#39; / &#39;utf8&#39; codec can&#39;t encode character &#39;\x??&#39; in position ? 解决有关Python编码的错误

在Python中,处理中文字符一直是很令人头痛的问题,一言不合就乱码,而且引起乱码的原因也不尽相同,有时候是python本身默认的编码器设置的不对,有时候是使用的IDE的解码器不对,还有的时候是终端terminal的解码器不对,有时候同一份代码在Python2上正常运行,Python3上就不行了,反正产生乱码的原因很多,这里就列举一些博主遇到过的一些错误及其解决方案: Error 1: UnicodeEncodeError: 'gbk' codec can't encode character

Sublime Text 2下搭建Python环境经常性错误

Sublime Text 2下搭建Python环境时,最容易出的错误就是Python环境配置错误,导致build(Ctrl+B)后没有任何反应. 关于Python编程环境的配置,网上很容易搜索到.先默认你已经在windows上安装好了Python编译环境,并且在sublime text 2中已经安装好了必要的插件.下边我们就直接配置Python了,让Python代码能够在Sublime Text 2里欢快的跑起来.常见的配置主要是两种. 一.在Windows高级系统设置里设置好环境变量的系统变量

python中的错误处理

错误的处理语法: try ... except ... finally ... 把可能会出错的代码放到try语句里面,执行出错,执行except语句块.如果有finally语句块,则执行finally语句块.执行没有错,不执行except语句块,但是一定会执行finally语句块. 可以有多个不同的except语句块. 实例: try:     print('try...')     r = 10/int('a')     print('result:', r) except ValueErro

python在使用MySQLdb模块时报Can&#39;t extract file(s) to egg cacheThe following error occurred while trying to extract file(s) to the Python eggcache的错误。

这个是因为python使用MySQLdb模块与mysql数据库交互时需要一个地方作为cache放置暂存的数据,但是调用python解释器的用户(常常是服务器如apache的www用户)对于cache所指向的位置没有访问权限. 解决方式有很多,这里介绍一个. 创建一个文件夹并给予该文件夹对应用户w的权限(不确定是哪个用户的情况下可以直接给other置以w权限(linux下用户及权限机制自行百度)). 然后在每个python的脚本文件中加入 import osos.environ['PYTHON_E

mysql 初始化 时报错误

mysql  初始化 时报错误 Can't locate Data/Dumper.pm in @INC (@INC contains: /usr/local/lib64/perl5  /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl  /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .)  at scripts/mysql_install_db line 42. B

[python]一个低级错误/xxx instance has no attribute &#39;xxx&#39;/&#39;module&#39; object is not callable

今天在写代码的时候出现了以下两个错误: TypeError: 'module' object is not callable AttributeError: excelChange instance has no attribute 'xlBook' 上网一查,发现第一个错误是由于python中有两种不同的引用方式 import xxx 和 from xxx import *,前者在代码中引用时需要加上模块名和具体的方法或属性,具体方法如下: import catchForm self.xls