机器人 救救瓜
Toggle navigation
Home
SCM-tool
Linux
Jenkins
SVN
other
About Me
Archives
Tags
python 笔记之 构造函数 存取方法 生成器 迭代器
2021-03-10 17:16:11
254
0
0
gua_l
### 构造函数 构造函数(constructor),类定义中的初始化方法,命名为**__init__**。然而,构造函数不同于普通方法的地方在于,将在对象创建后自动调用它。 ### 析构函数 Python提供了魔法方法__del__,也称作析构函数(destructor)。这个方法在对象被销毁(作为垃圾被收集)前被调用,但鉴于你无法知道准确的调用时间,建议尽可能不要使用__del__。 ### 重写构造方法 重写的构造函数必须调用其超类的构造函数,以确保基本的初始化得以执行。为此,有两种方法:调用未关联的超类构造函数,以及使用函数super。super().__init__() ``` def __init__(self): super().__init__() ``` ### python 只要求对象遵循特定的协议 在Python中,协议通常指的是规范行为的规则,有点类似于第7章提及的接口。协议指定应实现哪些方法以及这些方法应做什么。在Python中,多态仅仅基于对象的行为(而不基于祖先,如属于哪个类或其超类等),因此这个概念很重要:其他的语言可能要求对象属于特定的类或实现了特定的接口,而Python通常只要求对象遵循特定的协议。因此,要成为序列,只需遵循序列协议即可。 ``` __len__(self) __getitem__(self, key) __setitem__(self, key,value) __delitem__(self, key) ``` ### 存取方法 通过存取方法定义的属性通常称为特性(property)。 get(),set() 函数 property,通过调用函数property并将存取方法作为参数(获取方法在前, 设置方法在后)创建了一个特性,然后将名称size关联到这个特性。这样,你就能以同样的方式对待width、height和size,而无需关心它们是如何实现的. ``` class Rectangle: def __init__ (self): self.width = 0 self.height = 0 def set_size(self, size): self.width, self.height = size def get_size(self): return self.width, self.height size = property(get_size, set_size) >>> r = Rectangle() >>> r.width = 10 >>> r.height = 5 >>> r.size ## 无需用get_size (10, 5) >>> r.size = 150, 100 ## 无需用set_size >>> r.width 150 ``` ### 静态方法和类方法 在Python 2.4中,引入了一种名为装饰器的新语法,可用于像这样包装方法。(实际上,**装饰器**可用于包装任何可调用的对象,并且可用于方法和函数。)可指定一个或多个装饰器,为此可在方法(或函数)前面使用运算符@列出这些装饰器(指定了多个装饰器时,应用的顺序与列出的顺序相反)。 ``` class MyClass: @staticmethod def smeth(): print('This is a static method') @classmethod def cmeth(cls): print('This is a class method of', cls) ``` 定义这些方法后,就可像下面这样使用它们**(无需实例化类)**: ``` >>> MyClass.smeth() This is a static method >>> MyClass.cmeth() This is a class method of <class '__main__.MyClass'> ``` ### 迭代器 **__iter__**,它是迭代器协议的基础。 迭代(iterate)意味着重复多次,就像循环那样。本书前面只使用for循环迭代过序列和字典,但实际上也可迭代其他对象:实现了方法**__iter__**的对象。 方法**__iter__**返回一个迭代器,它是包含方法**__next__**的对象,而调用这个方法时可不提供任何参数。当你调用方法**__next__**时,迭代器应返回其下一个值。如果迭代器没有可供返回的值,应引发StopIteration异常。你还可使用内置的便利函数next,在这种情况下,next(it)与it.**__next__**()等效。 更正规的定义是,实现了方法**__iter__**的对象是可迭代的,而实现了方法**__next__**的对象是迭代器。 以下,[1,2,3] 就是实现了iter方法的对象,它是可以迭代的,并且它实现了next 方法,返回下一个值。 ``` >>> it = iter([1, 2, 3]) >>> next(it) 1 >>> next(it) 2 ``` 迭代器定义和示例 ``` class Fibs: def __init__(self): self.a = 0 self.b = 1 def __next__(self): self.a, self.b = self.b, self.a + self.b return self.a def __iter__(self): return self fibs = Fibs() for f in fibs: if f > 1000: print(f) break ``` ### 生成器 生成器是一种使用普通函数语法定义的迭代器。 包含yield语句的函数都被称为生成器。这可不仅仅是名称上的差别,生成器的行为与普通函数截然不同。差别在于,生成器不是使用return返回一个值,而是可以生成多个值,每次一个。每次使用yield生成一个值后,函数都将冻结,即在此停止执行,等待被重新唤醒。被重新唤醒后,函数将从停止的地方开始继续执行。 ``` def flatten(nested): for sublist in nested: for element in sublist: yield element ``` #### 简单生成器 #### 递归式生成器 #### 通用生成器 生成器是包含关键字yield的函数,但被调用时不会执行函数体内的代码,而是返回一个迭代器。每次请求值时,都将执行生成器的代码,直到遇到yield或return。yield意味着应生成一个值,而return意味着生成器应停止执行(即不再生成值;仅当在生成器调用return时,才能不提供任何参数)。 换而言之,生成器由两个单独的部分组成:生成器的函数和生成器的迭代器。生成器的函数是由def语句定义的,其中包含yield。生成器的迭代器是这个函数返回的结果。用不太准确的话说,这两个实体通常被视为一个,通称为生成器
Pre:
kernel upgrade
Next:
python 笔记之 多态、封装、方法、属性、超类和继承
0
likes
254
Weibo
Wechat
Tencent Weibo
QQ Zone
RenRen
Submit
Sign in
to leave a comment.
No Leanote account?
Sign up now.
0
comments
More...
Table of content
No Leanote account? Sign up now.