zoukankan      html  css  js  c++  java
  • Python学习8——魔法方法、特性和迭代器

    Python中很多名称比较古怪,开头和结尾都是两个下划线。这样的拼写表示名称有特殊意义,因此绝不要在程序中创建这样的名称。这样的名称中大部分都是魔法(方法)的名称。如果你的对象实现了这些方法,他们将在特定情况下(具体是何种情况取决于方法的名称)被Python调 用,而几乎不需要直接调用。

    1、构造函数

     你可能从未听说过过构造函数,它其实就是我们之前示例中使用的初始化方法,只是命名为__init__。然而构造函数不同于普通方法的地方在于,将在对象创建时自动调用它们。

    >>> class FooBar:
        def __init__(self):
            self.somevar=42
    
        
    >>> f=FooBar()
    >>> f.somevar
    42

    如果创建对象时带上参数

    >>> class FooBar:
        def __init__(self,value=42):
            self.somevar=value
    
            
    >>> f=FooBar("This is a init funcation")
    >>> f.somevar
    'This is a init funcation'

    在所有方法中__init__绝对是使用最多的方法

    Python提供了析构方法 __del__ 这个方法在对象被销毁之前被调用,但鉴于你不知道什么时间调用,所以最好不要用到。

    1.1重写普通方法和特殊的构造方法

    鉴于之前的JAVA基础,在学习之后发现,面向对象编程此处没有什么区别,因此只做简单复习。

    重写是继承机制的一个重要方面,对构造函数来说尤其重要。构造函数由于初始化新建对象的状态,而对大多数子类来说,除了超类的初始化代码之外,还需要有自己的初始化代码。

    虽然重写的机制都一样,但构造函数的重写,必须要调用超类的构造函数农户,否则会引发异常。

    有的时候子类的构造函数重写的,导致新的构造函数没有包含任何超类构造函数中的代码,导致出现错误。为了解决这个问题,子类的构造函数必须调用其超类的构造函数,以确保基本的代码会得到执行。为此,有两种方法,调用未关联的超类构造函数,以及使用函数super。

    1.2调用未关联的超类函数

    >>> class Bird:
        def __init__(self):
            self.hungry=True
        def eat(self):
            if self.hungry:
                print("I'm hungry.....weishizhong....")
                self.hungry=False
            else :
                print("No,thanks!I'm OK.")
    
                
    >>> class SingBird(Bird):
        def __init__(self):
            Bird.__init__(self)
            self.sound="qiu qiu qiu..."
        def sing(self):
            print(self.sound)
    
            
    >>> newbird=SingBird()
    >>> newbird.sing()
    qiu qiu qiu...
    >>> newbird.eat()
    I'm hungry.....weishizhong....
    >>> newbird.eat()#即使Singbird未定义eat方法,仍然可以使用hungry变量
    No,thanks!I'm OK.

    为什么可以这样哪?对实例调用方法时,方法的参数self将会自动关联到实例。然而,如果你通过类调用方法,就没有实例与之相关联。在这种情况下你可以随便设置参数self。这样的方法称为未关联的。

    通过将这个未关联方法的self参数设置为当前实例,将使用超类的构造函数来初始化SingBird对象,这意味着将设置属性hungry。

    1.3使用函数super()

    super函数只适用于Python3版本,而且你应该这样做,而尽量不要采用上面的方法。

    >>> class Bird:
        def __init__(self):
            self.hungry=True
        def eat(self):
            if self.hungry:
                print("I'm hungry.....weishizhong....")
                self.hungry=False
            else :
                print("No,thanks!I'm OK.")
    
                
    >>> class SingBird(Bird):
        def __init__(self):
            super().__init__()
            self.sound="qiu qiu qiu..."
        def sing(self):
            print(self.sound)
    
            
    >>> newbird=SingBird()
    >>> newbird.sing()
    qiu qiu qiu...
    >>> newbird.eat()
    I'm hungry.....weishizhong....
    >>> newbird.eat()#即使Singbird未定义eat方法,仍然可以使用hungry变量
    No,thanks!I'm OK.

    使用super 的优点,即使有很多超类,只用使用一次super 就可以了,super是什么你根本不用去管!!!

    2、元素访问

    基本的序列和映射协议非常简单,但要实现序列和映射的所有功能,需要很多魔法方法,后面会学习到。

    在Python中协议通常指的是规范行为的规则,有点类似之前提到的接口。协议指定应实现哪些方法以及这些方法应做什么。

    2.1基本的序列和映射协议

    序列和映射基本上是元素的集合,要实现他们的基本行为(协议),不可变对象需要实现两个方法,而可变对象需要四个

    __len__(self)

    __getitem(self,key)

    __setitem__(self, key, value)

    __delitem__(self, key)

                      

  • 相关阅读:
    抽象代数学习笔记
    WC2021 游记
    简单的数学题
    前缀和公式
    杜教筛
    [模板]BZOJ4756线段树合并
    SPOJ 694
    bzoj1367 可并堆
    莫比乌斯反演(理论)
    es6 Set数据结构
  • 原文地址:https://www.cnblogs.com/jiameng991010/p/11257918.html
Copyright © 2011-2022 走看看