类、特性和迭代器
- self:指向对象本身
访问权限
- 私有:__member,在成员属性面前加两个下划线
继承
- issubclass(child,base):确定一个类是否是另一个类的子类,是内置方法
- bases:特殊属性,可以知道它的基类
- isinstance(s,SPAMFilter):是否是特定类的实例
- 如果继承多个类,而这些类中有相同的方法,继承时排在前面的类方法会覆盖后面的类方法
接口和内省
- hasattr(tc,‘talk’):知道对象中是否有某个属性,有返回True,没有返回False
- setattr(tc,‘talk’):设置对象属性
- dict:特殊属性,可以查看对象的所有值
抽象
- @abstractmethod:装饰器,标记下面的方法为抽象的,在子类中必须实现
特性
- property():将存取方法作为参数(获取方法在前,设置方法在后)创建了一个特性,再用一个变量来关联,统一对成员变量赋值
class Rectangle:
def __init__(self):
self.width = 0
self.height = 0
def set_size(self,size):
self.width,self.height = size
size = property(get_size,set_size)
r = Rectangle()
r.size = 150,100 #能够直接对size进行修改
- @staticmethod:装饰器,表示下面方法为静态方法
- @classmethod:表示下面方法为类方法
__ getattr__等方法,可以拦截对对象属性的所有访问企图
-
__ getattribute __(self,name):在属性被方法时自动调用
-
__ getattr__(self,name):属性被访问,而该属性没有时调用
-
__ setattr__(self,name,value):给属性赋值时调用,需要避免无限循环,而用dict[]
-
__ delattr__(self,name):删除调用
-
__ dict__[name] = value:字典,在setattr中使用防止无限循环
迭代器
- __ iter __():该方法返回一个迭代器,包含方法__next__的对象,也可用内置函数next(it)与it.__next__()等效
#不停的迭代,没有返回对象时会引发StopIteration异常
def __next__(self):
self.a = self.a + self.b
return self.a
#返回本身,可用在for循环中进行迭代
def __iter__(self):
return self
- 可以将迭代对象转化为序列,通过list()等函数
生成器
生成器是一种使用普通函数语法定义的迭代器
- 包含yield的语句的函数都被称为生成器
- 每次使用yield生成一个值后,函数都将冻结,在此体质执行,然后等待被重新唤醒,唤醒后在源代码位置执行
- 函数被调用时,不会执行函数体内的代码,而返回一个迭代器,只能返回迭代器,否则会抛出异常
nested = [[1, 2], [3, 4], [5]]
def flatten(nested):
for sublist in nested:
for element in sublist:
yield element
- 迭代生成,例如列表来表示树结构
def flatten(nested):
try:
for sublist in nested:
for element in flatten(sublist):
yield element
except TypeError:
yield nested