魔法方法

魔法方法

简单定制

在这里插入图片描述

import time as t

class Mytimer():#开始计时
    def __init__(self):
        self.lasted = []
        self.prompt = "未开始计时"
        self.begin = 0
        self.end = 0

    def __str__(self):
        return self.prompt
    def __repr__(self):
        return self.prompt

    def start(self):
        self.begin = t.localtime()
        print("计时开始。。。")
        #停止计时
    def stop(self):
        self.end = t.localtime()
        #self._calc()
        print("计时结束!")
    #内部方法,计算运行时间
    def _calc(self):
        self.lasted = []
        self.prompt = "总共运行了"
        for index in range(6):
            self.lasted.append(self.end[index]-self.begin[index])
            self.prompt +=str(self.lasted[index])
        print(self.prompt)

属性访问

property函数

以下是 property() 方法的语法:

class property([fget[, fset[, fdel[, doc]]]])
'''
参数
fget -- 获取属性值的函数
fset -- 设置属性值的函数
fdel -- 删除属性值函数
doc -- 属性描述信息
'''
class C:
    def __init__(self,size =10):
        self.size = size
    def getSize(self):
        return self.size
    def setSize(self,value):
        self.size = value
    def delSize(self):
        del self.size
    x = property(getSize,setSize,delSize)
c = C()
print(c.size)
c.x  = 1
print(c.size)
del c.size
print(c.size)

在这里插入图片描述

class rectangle:
    def __init__(self,width = 0,height = 0):
        self.width = width
        self.height = height
    def __setattr__(self, name, value):
        if name == 'square':
            self.width = value
            self.height = value
        else:
            super().__setattr__(name,value)
            #基类

    def getArea(self):
        return self.width *self.height
r1 = rectangle(4,5)
print(r1.getArea())
r1.square = 10
print(r1.height)
print(r1.width)
print(r1.getArea())

说明:

super()函数用于调用父类(超类)的一个方法。

描述符

描述符就是将某种特殊类型的类的实例指派给另一个类的属性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-073Lg22x-1605796279117)(C:\Users\吴双双\AppData\Roaming\Typora\typora-user-images\image-20201104120448919.png)]

class MyDecriptor:
    def __get__(self, instance, owner):
        print("getting...",self,instance,owner)
    def __set__(self,instance,value):
        print("setting...",self,instance,value)
    def __delete__(self, instance):
        print("deleting...",self,instance)
class Test:
    x = MyDecriptor()
test = Test()
test.x

定制序列

协议(Protocols)与其他编程语言中的接口很相似,它规定你哪些方法必须要定义。然而,在python中的协议就显得不那么正式。事实上,在python中,协议更像是一种指南。

在这里插入图片描述

class CountList:
    def __init__(self,*args):
        self.values = [x for x in args]
        self.count = {}.fromkeys(range(len(self.values)),0)

    def __len__(self):
        return len(self.values)

    def __getitem__(self, key):
        self.count[key] += 1
        return self.values[key]

说明:

fromkeys() 函数用于创建一个新字典,语法如下:

dict.fromkeys(seq[, value])
#seq--字典键值列表
#value--可选参数,设置键序列(seq)对应的值,默认为None.
#返回值--一个新字典

迭代器

__iter():返回迭代器本身

next():获取下一个数

斐波那契数列

class Fibonacci(object):
    """斐波那契数列迭代器"""

    def __init__(self, n):
        """
        :param n:int 指 生成数列的个数
        """
        self.n = n
        # 保存当前生成到的数据列的第几个数据,生成器中性质,记录位置,下一个位置的数据
        self.current = 0
        # 两个初始值
        self.a = 0
        self.b = 1

    def __next__(self):
        """当使用next()函数调用时,就会获取下一个数"""
        if self.current < self.n:
            self.a, self.b = self.b, self.a + self.b
            self.current += 1
            return self.a
        else:
            raise StopIteration

    def __iter__(self):
        """迭代器的__iter__ 返回自身即可"""
        return self


if __name__ == '__main__':
    fib = Fibonacci(15)
    for num in fib:
        print(num)

生成器

协同程序就是可以运行的独立函数调用,函数可以暂停或者挂起,并在需要的时候从程序离开的地方继续或者重新开始。

斐波那契数列

方法二

def fibs():
    a = 0
    b = 1
    while True:
        a,b = b,a+b
        yield  a
        
for i in fibs():
    if i>100:
        break
    print(i,end=" ")
    

列表推导式

a = [i for i in range(100) if not (i % 2)and i % 3]
print(a)
#能被2整除但不能被3整除

字典推导式

b = {i : i % 2 ==0 for i in range(10)}
print(b)

在这里插入图片描述

集合推导式

c = {i for i in [1,1,1,2,3,4,5,5,7,8,6,5,3,2]}
print(c)
#输出结果为{1,2,3,4,5,6,7,8}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值