python中构造方法的名称 python构造方法的特点

您所在的位置:网站首页 构造方法python中的名称 python中构造方法的名称 python构造方法的特点

python中构造方法的名称 python构造方法的特点

2024-05-20 14:02| 来源: 网络整理| 查看: 265

特殊方法、特性和迭代器1. 新式类和旧式类2. 特殊方法(魔法方法)3. 构造函数4. 方法重写5. 基本的序列和映射协议5.1 协议5.2 基本的序列和映射协议5.3 从list、dict和str派生6. 特性6.1 函数property6.2 静态方法和类方法6.3 `__getattr__、__setattr__`等方法7. 迭代器8. 生成器

1. 新式类和旧式类

    python类的工作方式在不断变化。较新的Python2版本有两种类,其中旧式类正快速退出舞台。新式类时Python2.2 引入的,提供了一些额外功能,如支持函数super 和 property,而旧式类不支持。要创建新式类,必须直接或间接的继承Object 或设置 __metaclass__。

2. 特殊方法(魔法方法)

    Python中有很多特殊方法,其名称以两个下划线开头和结尾。这些方法的功能各不相同,但大都由python 自动调用。

3. 构造函数

    在很多面向对象语言中都有构造函数这一概念,如java,主要用于对创建对象进行初始化。python中,构造函数名为__init__,在对象被创建后自动调用该方法。

    注意:python还提供了一个在对象销毁前被调用,该方法为__del__,通常称它为析构函数。

4. 方法重写

    子类可对超类中定义的方法(以及其他任何属性)进行重写,为此只需实现这些方法即可。要调用被重写的版本,可直接通过超类调用为关联版本(旧式类),也可使用函数super()来调用(新式类)。

5. 基本的序列和映射协议5.1 协议

    在python中,协议通常指的是规范行为的规则。在python中,多态仅仅基于对象的行为(而不是基于祖先,如属于哪个类或其超类等),因此,在python中,通常只要求对象遵循特定的协议。比如,要成为序列,只需遵循序列协议即可。

5.2 基本的序列和映射协议

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

__len__(self):这个方法应返回集合包含的项数。如果没有实现__len__方法,则表示无穷序列。 __getitem__(self, key):这个方法应返回与指定键相关联的值。对序列来说,键应该是下标(0 ~ n-1或为-1 ~ -n)。对于映射来说可以是任何类型。 __setitem__(self, key):这个方法应以与键相关联的方式存储值,以便以后能够使用__gititem__来获取。当然,仅对象可变时才需要实现这个方法。 __delitem__(self, key):这个方法在对对象的组成部分使用__del__语句时被调用,应删除与key相关联的值。同样,仅对象可变时才需要实现这个方法。

    对于这些方法,还有一些额外的要求:         1.对于序列,如果键为负数,应从末尾往前数。即x[-n] 与x[len(x) - n] 等效;         2.如果键的类型不合适(如对序列使用字符串键),可能引发TypeError异常;         3.对于序列,如果所有的类型正确,但不在允许的范围内,应引发IndexError异常。

5.3 从list、dict和str派生

    基本的序列和映射协议还能通过继承来实现。在python标志库中,模块collections提供了抽象和具体的基类,但你也可以继承内置类型,如list、dict和str等。

6. 特性

    在python中,通过存取方法定义的属性通常称为特性。

6.1 函数property

    函数property(getmethod, setmethod, delmethod, doc)创建一个特性,可以不指定参数、指定一个参数、指定是三个参数或指定四个参数。如果没有指定参数,创建的特性即不可读也不可写。如果指定一个参数(只能为get),创建的特性是可读的。如果指定三个参数,指定用于删除的delmethod方法不接受任何参数。如果指定四个参数,第四个为一个文档字符串。如:

class Person: def __init(self): self.name = '' self.age = 0 def setName(self, value): self.name = value def getName(self): return self.name permsg = property(getName, setName)6.2 静态方法和类方法

    静态方法和类方法是这样创建的:将他们分别包装在staticmethod和classmethod类的对象中。静态方法中没有参数self,可直接通过类来调用。类方法的定义中包含类似于self的参数,通常被命名为cls,可直接通过类来调用,cls参数自动关联到类。如:

class Person: def static_method(): pass static_method = staticmethod(static_method) def class_method(cls): pass class_method = classmethod(class_method)

    像这样手工进行包装盒替换的方法有点儿繁琐。而程序员都是比较懒得,所有在Python2.4 中引入了一种名为装饰器的新语法,可在方法(或函数)前面使用运算符@列出这些装饰器(指定多个装饰器是,应用顺序与列出顺序相反)。如:

class Person @staticmethod def static_method(): pass @classmethod def class_method(cls): pass6.3 __getattr__、__setattr__等方法 __getattribute__(self, name):在属性被访问时自动调用(只适用于新式类) __getattr__(self, name):在属性被访问而对象没有这样的属性时自动调用 __setattr__(self, name, value):视图给属性赋值时自动调用 __delattr__(self, name):视图删除属性时自动调用

    在实际操作中,如果想避免调用__setattr__方法,可以使用__dict__属性,该属性时一个字典,其中包含所有的实例属性。如:self.__dict__[name] = value 就不会再次调用__setattr__方法了。

7. 迭代器

    迭代表示可以重复多次。比如使用for方法进行循环迭代序列和字典,但实际也可以迭代其他对象,但是该对象必须实现了__iter__方法。

    方法__iter__返回一个迭代器,它是包含__next__方法的对象。当调用__next__时,迭代器应返回其下一个值。如果没有了值进行返回,将引发StopIteration异常。你还可以使用内置的便利函数next,在这种情况下,next(it) 与 it.__next__等效。

    注意:实现了方法__iter__的对象时可迭代的,而实现了方法__next__的对象是一个迭代器。

8. 生成器

    包含了关键字yield的函数表示一个生成器,是一种特殊的迭代器。函数在每次使用yield生成一个值后,都将冻结,即在此停止执行,并返回值,等待下次调用重新被唤醒,被唤醒后,函数将从停止的地方开始继续执行。

    send(value):接受一个参数,表示要发送的消息,该value将代替上次的yield停止的位置。仅当生成器被挂起(即遇到第一个yield)后,使用send才有意义。

    throw:用于在生成器中(yield表达式处)引发异常,调用时可提供一个异常类型、一个可选择和一个traceback对象。

    close:用于停止生成器,调用时无需任何参数。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3