python【系列教程】之类的特殊方法

一、常见的特殊方法

# 重写__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语句内)引发一个异常

 

五、运算符重载的特殊方法

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章