一、常见的特殊方法
# 重写__repr__方法(相当于java中的toString方法)
class Dog:
name = ''
age = 0
def __repr__(self) -> str:
return "name:" + self.name + ",age:" + str(self.age)
d = Dog()
d.name = '小狗'
d.age = 20
print(d)
class Apple:
def __init__(self, color, weight):
self.color = color
self.weight = weight
def __repr__(self):
return "Apple[]"
a = Apple('红色', 5.68)
print(a)
需要说明的是,不要以为对一个变量执行del操作,该变量所引用的对象就会被回收 -- 只有当对象的引用计数变成0时,该对象才会被回收,因此,如一个对象有多个变量引用它 ,那么del其中一个变量是不会回收该对象的。
二、与反射相关的属性和方法
#与反射相关的属性和方法
"""
hasattr(obj,name) 检查对象是否包含name的属性或者防范
getattr(obj,name[,default]) 获取对象中名字为name的属性的属性值
setattr(obj,name,value,/) 将obj对象的name属性设为value
"""
三、与序列相关的特殊方法
四、生成器
# 实现迭代器
class Fibs:
def __init__(self, len):
self.first = 0
self.sec = 1
self.__len = len
def __next__(self):
if self.__len == 0:
raise StopIteration
# 完成数列计算
self.first, self.sec = self.sec, self.first + self.sec
self.__len -= 1
return self.first
def __iter__(self):
return self
fibs = Fibs(10)
print(next(fibs))
for el in fibs:
print(el, end=' ')
# 创建生成器
"""
1.定义一个包含yield语句的函数
2.调用第一步创建的函数得到生成器
"""
def test(val, step):
print("函数开始执行~~~~~~~~~~~~")
cur = 0
# 遍历0~val
for i in range(val):
cur += i * step
yield cur
"""yield cur语句的作用
每次返回一个值,有点类似于return
冻结执行,程序每次执行yield语句时就会被暂停。
在程序被yield语句冻结之后,当程序再次调用next()函数获取生成器的下一个值时,
程序才会继续向下执行
需要指出的是,调用包含yield语句的函数并不会立即执行,它只会返回一个生成器。
只有当程序通过next()函数调用生成器或者遍历生成器时,函数才会真正执行
"""
t = test(10, 2)
# 获取下一个值
print(next(t))
print(next(t))
# 将生成器转换成列表
l = list(t)
t = tuple(t)
#close() 该方法用于停止生成器,关闭生成器之后,无法再获取下一个值,否则就会报错
#throw() 该方法用于在生成器内部(yield语句内)引发一个异常
五、运算符重载的特殊方法