[Code] Python继承防坑小记

今天想和大家谈一下小白在写python代码时,在继承中遇到的两个坑。
相信大家对于python的构造方法一定不陌生吧,在python中用__init__来对类进行初始化,如下例:

class City():
    def __init__(self):
        self.empty = True

    def build(self):
        if self.empty:
            print 'i need buildings'
            self.empty = False
        else:
            print 'plz do other things'

这个栗子中的__init__方法里定义了初始变量empty,并且通过build方法来切换empty的值。
下面我们来构造一个City的子类District:

class District(City):
      pass
      
>>>d = District()
>>>d.empty
True

现在这个空空荡荡的District类继承了父类City,当它被调用时,首先在自身寻找empty变量,当找不到时,则会去父类中找。我们希望为它定义一些初始变量,试一下:

class District(City):
    def __init__(self):
        self.vehicle = 'bicycles'
        
    def traffic(self):
        print self.vehicle

>>> d = District()
>>> d.traffic()
AttributeError: 'District' object has no attribute 'empty'

这是第一个坑,我们为District类创建初始化方法时,会将City类初始化方法中定义的empty变量覆盖。那么我们该如何解决该问题呢?
这里就要用到super函数:

class District(City):
    def __init__(self):
        self.vehicle = 'bicycles'
        super(District, self).__init__()

    def traffic(self):
        print self.vehicle

这样就能保证District类既能继承City方法的初始化变量,有可以使用自己的初始化变量。
以为问题都解决了?然鹅,并没有,我们来运行一下:

>>>d = District()
>>>d.traffic()
TypeError: must be type, not classobj

又是一个坑 T-T
查了资料后发现,python中的super只能应用于新类,而不能应用于经典类,而所谓新类就是所有类都必须要有继承的类。然鹅City并不需要继承于哪个类,怎么办呢?我们可以将它继承到object类,像这样(python3就能规避这个问题,因为python3没有经典类):

class City(object):
    def __init__(self):
        self.empty = True

    def build(self):
        if self.empty:
            print 'i need buildings'
            self.empty = False
        else:
            print 'plz do other things'


class District(City):
    def __init__(self):
        self.vehicle = 'bicycles'
        super(District, self).__init__()

    def traffic(self):
        print self.vehicle


sb = District()
sb.traffic()

然后,一切都平静了...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 9,717评论 4 16
  • 本文为《爬着学Python》系列第十四篇文章。 中间因为工作原因隔了好久没有更新,现在稳定很多,会陆续开始更新。不...
    SyPy阅读 14,212评论 1 10
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,589评论 18 399
  • 1、项目需求 同一个类有多个alertView, 不同的alertView 点击确定按钮 执行的方法不同 aler...
    吴佩在天涯阅读 4,294评论 1 0
  • 赖某生前欠了朋友很多债,只要有了钱就去吃喝嫖赌,从不考虑偿还的问题。有人问他,你这样借人钱没考虑过还吗?他冷笑道:...
    方从山阅读 3,800评论 7 8

友情链接更多精彩内容