AI集中训练营Python打卡——第七天

魔法方法

# __init__(self[, ...]) 构造器,当一个实例被创建的时候调用的初始化方法
class Rectangle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
​
    def getPeri(self):
        return (self.x + self.y) * 2
​
    def getArea(self):
        return self.x * self.y
​
​
rect = Rectangle(4, 5)
print(rect.getPeri())  # 18
print(rect.getArea())  # 20
18
20
'''
__new__(cls[, ...]) 在一个对象实例化的时候所调用的第一个方法,在调用__init__初始化前,先调用__new__。
__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init__。
__new__对当前类进行了实例化,并将实例返回,传给__init__的self。但是,执行了__new__,并不一定会进入__init__,只有__new__返回了,当前类cls的实例,当前类的__init__才会进入。
'''
class A(object):
    def __init__(self, value):
        print("into A __init__")
        self.value = value
​
    def __new__(cls, *args, **kwargs):
        print("into A __new__")
        print(cls)
        return object.__new__(cls)
​
​
class B(A):
    def __init__(self, value):
        print("into B __init__")
        self.value = value
​
    def __new__(cls, *args, **kwargs):
        print("into B __new__")
        print(cls)
        return super().__new__(cls, *args, **kwargs)
​
​
b = B(10)
​
# 结果:
# into B __new__
# 
# into A __new__
# 
# into B __init__
​
class A(object):
    def __init__(self, value):
        print("into A __init__")
        self.value = value
​
    def __new__(cls, *args, **kwargs):
        print("into A __new__")
        print(cls)
        return object.__new__(cls)
​
​
class B(A):
    def __init__(self, value):
        print("into B __init__")
        self.value = value
​
    def __new__(cls, *args, **kwargs):
        print("into B __new__")
        print(cls)
        return super().__new__(A, *args, **kwargs)  # 改动了cls变为A
​
​
b = B(10)
​
# 结果:
# into B __new__
# 
# into A __new__
# 
into B __new__

into A __new__

into B __init__
into B __new__

into A __new__

# __new__方法主要是当你继承一些不可变的 class 时(比如int, str, tuple), 提供给你一个自定义这些类的实例化过程的途径。
class CapStr(str):
    def __new__(cls, string):
        string = string.upper()
        return str.__new__(cls, string)
​
​
a = CapStr("i love lsgogroup")
print(a)  # I LOVE LSGOGROUP
I LOVE LSGOGROUP
# 类型工厂函数,指的是“不通过类而是通过函数来创建对象”。
class C:
    pass
​
​
print(type(len))  # 
print(type(dir))  # 
print(type(int))  # 
print(type(list))  # 
print(type(tuple))  # 
print(type(C))  # 
print(int('123'))  # 123
​
# 这个例子中list工厂函数把一个元祖对象加工成了一个列表对象。
print(list((1, 2, 3)))  # [1, 2, 3]






123
[1, 2, 3]
'''
__add__(self, other)定义加法的行为:+
__sub__(self, other)定义减法的行为:-
'''
class MyClass:
​
    def __init__(self, height, weight):
        self.height = height
        self.weight = weight
​
    # 两个对象的长相加,宽不变.返回一个新的类
    def __add__(self, others):
        return MyClass(self.height + others.height, self.weight + others.weight)
​
    # 两个对象的宽相减,长不变.返回一个新的类
    def __sub__(self, others):
        return MyClass(self.height - others.height, self.weight - others.weight)
​
    # 说一下自己的参数
    def intro(self):
        print("高为", self.height, " 重为", self.weight)
​
​
def main():
    a = MyClass(height=10, weight=5)
    a.intro()
​
    b = MyClass(height=20, weight=10)
    b.intro()
​
    c = b - a
    c.intro()
​
    d = a + b
    d.intro()
​
​
if __name__ == '__main__':
    main()
​
# 高为 10  重为 5
# 高为 20  重为 10
# 高为 10  重为 5
# 高为 30  重为 15
高为 10  重为 5
高为 20  重为 10
高为 10  重为 5
高为 30  重为 15
'''
__mul__(self, other)定义乘法的行为:*
__truediv__(self, other)定义真除法的行为:/
__floordiv__(self, other)定义整数除法的行为://
__mod__(self, other) 定义取模算法的行为:%
__divmod__(self, other)定义当被 divmod() 调用时的行为
divmod(a, b)把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b)。
'''
print(divmod(7, 2))  # (3, 1)
print(divmod(8, 2))  # (4, 0)
(3, 1)
(4, 0)
'
'''__pow__(self, other[, module])定义当被 power() 调用或 ** 运算时的行为
__lshift__(self, other)定义按位左移位的行为:<<
__rshift__(self, other)定义按位右移位的行为:>>
__and__(self, other)定义按位与操作的行为:&
__xor__(self, other)定义按位异或操作的行为:^
__or__(self, other)定义按位或操作的行为:|
​
反算术运算符
反运算魔方方法,与算术运算符保持一一对应,不同之处就是反运算的魔法方法多了一个“r”。当文件左操作不支持相应的操作时被调用。
​
__radd__(self, other)定义加法的行为:+
__rsub__(self, other)定义减法的行为:-
__rmul__(self, other)定义乘法的行为:*
__rtruediv__(self, other)定义真除法的行为:/
__rfloordiv__(self, other)定义整数除法的行为://
__rmod__(self, other) 定义取模算法的行为:%
__rdivmod__(self, other)定义当被 divmod() 调用时的行为
__rpow__(self, other[, module])定义当被 power() 调用或 ** 运算时的行为
__rlshift__(self, other)定义按位左移位的行为:<<
__rrshift__(self, other)定义按位右移位的行为:>>
__rand__(self, other)定义按位与操作的行为:&
__rxor__(self, other)定义按位异或操作的行为:^
__ror__(self, other)定义按位或操作的行为:|'''
​
'''
描述符就是将某种特殊类型的类的实例指派给另一个类的属性。
​
__get__(self, instance, owner)用于访问属性,它返回属性的值。
__set__(self, instance, value)将在属性分配操作中调用,不返回任何内容。
__del__(self, instance)控制删除操作,不返回任何内容。
'''
class MyDecriptor:
    def __get__(self, instance, owner):
        print('__get__', self, instance, owner)
​
    def __set__(self, instance, value):
        print('__set__', self, instance, value)
​
    def __delete__(self, instance):
        print('__delete__', self, instance)
​
​
class Test:
    x = MyDecriptor()
​
​
t = Test()
t.x
# __get__ <__main__.MyDecriptor object at 0x000000CEAAEB6B00> <__main__.Test object at 0x000000CEABDC0898> 
​
t.x = 'x-man'
# __set__ <__main__.MyDecriptor object at 0x00000023687C6B00> <__main__.Test object at 0x00000023696B0940> x-man
​
del t.x
# __delete__ <__main__.MyDecriptor object at 0x000000EC9B160A90> <__main__.Test object at 0x000000EC9B160B38>
__get__ <__main__.MyDecriptor object at 0x00000133D51AA580> <__main__.Test object at 0x00000133D51AA9A0> 
__set__ <__main__.MyDecriptor object at 0x00000133D51AA580> <__main__.Test object at 0x00000133D51AA9A0> x-man
__delete__ <__main__.MyDecriptor object at 0x00000133D51AA580> <__main__.Test object at 0x00000133D51AA9A0>
'''
迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。
迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。
迭代器只能往前不会后退。
字符串,列表或元组对象都可用于创建迭代器:
'''
string = 'lsgogroup'
for c in string:
    print(c)
​
'''
l
s
g
o
g
r
o
u
p
'''
​
for c in iter(string):
    print(c)
l
s
g
o
g
r
o
u
p
l
s
g
o
g
r
o
u
p
'''
迭代器有两个基本的方法:iter() 和 next()。
iter(object) 函数用来生成迭代器。
next(iterator[, default]) 返回迭代器的下一个项目。
iterator -- 可迭代对象
default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,又没有下一个元素则会触发 StopIteration 异常。
'''
links = {'B': '百度', 'A': '阿里', 'T': '腾讯'}
​
it = iter(links)
while True:
    try:
        each = next(it)
    except StopIteration:
        break
    print(each)
​
# B
# A
# T
​
it = iter(links)
print(next(it))  # B
print(next(it))  # A
print(next(it))  # T
print(next(it))  # StopIteration
B
A
T
B
A
T
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
C:\Users\JINBIN~1\AppData\Local\Temp/ipykernel_16232/2732943645.py in 
     24 print(next(it))  # A
     25 print(next(it))  # T
---> 26 print(next(it))  # StopIteration

StopIteration: 

'''把一个类作为一个迭代器使用需要在类中实现两个魔法方法 __iter__() 与 __next__() 。
​
__iter__(self)定义当迭代容器中的元素的行为,返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。
__next__() 返回下一个迭代器对象。
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 __next__() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
'''
class Fibs:
    def __init__(self, n=10):
        self.a = 0
        self.b = 1
        self.n = n
​
    def __iter__(self):
        return self
​
    def __next__(self):
        self.a, self.b = self.b, self.a + self.b
        if self.a > self.n:
            raise StopIteration
        return self.a
​
​
fibs = Fibs(100)
for each in fibs:
    print(each, end=' ')
​
# 1 1 2 3 5 8 13 21 34 55 89
1 1 2 3 5 8 13 21 34 55 89 
'''
在 Python 中,使用了 yield 的函数被称为生成器(generator)。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
'''
def myGen():
    print('生成器执行!')
    yield 1
    yield 2
    
myG = myGen()
for each in myG:
    print(each)
​
'''
生成器执行!
1
2
'''
​
myG = myGen()
print(next(myG))  
# 生成器执行!
# 1
​
print(next(myG))  # 2
print(next(myG))  # StopIteration
生成器执行!
1
2
生成器执行!
1
2
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
C:\Users\JINBIN~1\AppData\Local\Temp/ipykernel_16232/1046637185.py in 
     26 
     27 print(next(myG))  # 2
---> 28 print(next(myG))  # StopIteration

StopIteration: 

def libs(n):
    a = 0
    b = 1
    while True:
        a, b = b, a + b
        if a > n:
            return
        yield a
​
​
for each in libs(100):
    print(each, end=' ')
​
# 1 1 2 3 5 8 13 21 34 55 89
1 1 2 3 5 8 13 21 34 55 89 
​

你可能感兴趣的:(python,人工智能,开发语言)