zoukankan      html  css  js  c++  java
  • python对象继承

    继承允许我们在两个或者更多的类之间创建一种“是一个”的关系,这种关系把共同的细节抽象到一个超类里。

    从技术上讲,每一个我们创建的类都使用了继承,所有的python类都是一个叫做object的特殊类的子类,如果我们不具体指明我们的类从其他类继承,那这个类自动从object继承过来。通过如下的语法,我们可以公开声明我们的类从object继承:

    class MySubClass(object):
        pass

    其中,object就是父类或者说是超类。MySubClass是子类。可以说是子类来源于父类,或者说是子类扩展了父类。

    class Contact:
        all_contacts = []
      
        def __init__(self, name, email):
            self.name = name
            self.email = email
            Contact.all_contacts.append(self)

    上面的例子中介绍了类变量,all_contacts的列表,它属于类定义中的一部分,会被这个类所有的实例共享。这里只有一个Contact.all_contacts列表,如果我们在任何一个对象调用self.all_contacts,他会引用这个列表。在初始化函数里面创建了一个新的contact类,这个列表会自动把这个对象添加进来。要小心这种用法,因为如果曾经使用self.all_contacts给这个变量赋值,那么将会在这个对象里面创建一个新的实例变量,这个类变量将会保持不变并且可以通过Contact.all_contacts访问到。

    如果需要在联系人中添加供应商信息,则如下:

    class Supplier(Contact):
        def order(self, order):
            print("If this were a real system we would send "
                     "{} order to {}".format(order, self.name))

    将上述的两端代码保存为脚本,然后使用python -i导入这个脚本,在交互的解释器中执行如下的语句

    $ python -i order.py 
    >>> c = Contact("Some Body", "somebody@example.net")
    >>> s = Supplier("Supplier", "supplier@example.net")
    >>> print(c.name, c.email, s.name, s.email)
    Some Body somebody@example.net Supplier supplier@example.net
    >>> c.all_contacts
    [<__main__.Contact object at 0x106eeefd0>, <__main__.Supplier object at 0x106f0f048>]
    >>> c.all_contacts[0]
    <__main__.Contact object at 0x106eeefd0>
    >>> c.all_contacts[0].name
    'Some Body'
    >>> c.all_contacts[1].name
    'Supplier'
    >>> c.all_contacts[1].email
    'supplier@example.net'
    >>> c.all_contacts[0].email
    'somebody@example.net'
    >>> c.order("I need pliers")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'Contact' object has no attribute 'order'
    >>> s.order("I need pliers")
    If this were a real system we would send I need pliers order to Supplier
    >>> 

     那么现在我们的Supplier类可以做任何Contact类可以做的事情,包括把自己添加到all_contacts这个列表中,和一个供应商需要处理的所有特殊的事情。这就是继承的魅力。

    参考:

    1、《Python3 面向对象编程》 [加]Dusty Philips 著

  • 相关阅读:
    【BUG】android.content.res.Resources$NotFoundException: File res/drawable-xxhdpi/toolbar_line.png from
    关于 折半查找 while 条件 &lt; , &lt;=
    Unity3D——加入剑痕效果(PocketRPG Trail插件)
    用外部物理路由器时使用Neutron dhcp-agent提供的metadata服务(by quqi99)
    项目经理之项目经理注意事项
    让你提前认识软件开发(37):研发流程初探
    1.RunLoop是什么?
    列表类型内置方法
    字符串类型内置方法
    数字类型内置方法
  • 原文地址:https://www.cnblogs.com/anovana/p/8136095.html
Copyright © 2011-2022 走看看