魔术方法

重写,覆盖,复写父类中的方法

class A():
    def __init__(self,name,age):
        self.name=name
        self.age=age
class B(A):
    def __init__(self,name,age,sex):  
        self.sex=sex
        super().__init__(name,age)

#a=A("李四",17)
#print(a.__age)
#b=B("张三",38)
b=B("张三",38,"男")
#print(b.name)
#print(b.__age)

钻石继承:

class A():
    def f(self):
        print("a")
class B(A):
    def f(self):
        super().f()
        print("b")
class C(A):
    def f(self):
        super().f()
        print("c")
class D(B,C):
    def f(self):
        super().f()
        print("D")
d=D()
d.f()

多态的例子:

class Dog():
    def jiao(self):
        print("汪汪")
class Cat():
    def jiao(self):
        print("喵喵")
def honghong(a):
    a.jiao()
c=Cat()
d=Dog()
honghong(c)
honghong(d)

魔术方法

#del
销毁魔术方法
触发时机: 当一个对象在内存中被销毁的时候执行


class A():
    num=0  #类属性也叫静态属性
    def __init__(self,name):
        A.num+=1  # 每定义一个对象,我的计数器加1
        self.name=name
    def __del__(self):
        A.num-=1
        print(self.name,"被删除,还剩下{}个对象".format(A.num))
a=A("张三")
b=A("李四")
c=A("王五")
print(A.num)
del a
del b
del c
#3
#张三 被删除,还剩下2个对象
#李四 被删除,还剩下1个对象
#王五 被删除,还剩下0个对象

class A():
    def __init__(self,num):
        self.num=num
    def __call__(self,n):
        return self.num*n
a=A(7)
b=a(9)  # 把对象当成函数用,让类的实例具有类似于函数的行为
print(b)  # 63

class Fib():
    def __init__(self):
        pass
    def __call__(self,month):
        lst=[]
        a,b=1,1
        n=1
        while n<=month:
            lst.append(a)
            a,b=b,a+b
            n+=1
        return lst
f=Fib()
for i in range(1,10):
    print(f(i))
class Fib():
    def __init__(self):
        pass
    def __call__(self,month):
        lst=[]
        a,b=1,1
        n=1
        while n<=month:
            lst.append(a)
            a,b=b,a+b
            n+=1
        return lst[len(lst)-1]
f=Fib()
for i in range(1,10):
    print(f(i))
class Fib():
    def __init__(self):
        pass

    def __call__(self, month):
        lst = []
        a, b = 0, 1
        n = 1
        while n <= month:
            lst.append(a)
            a, b = b, a + b
            n += 1
        return a


f = Fib()
for i in range(1, 10):
    print(f(i))

class Per():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return "{},{}".format(self.name, self.age)
    def __repr__(self):  # 复写了父类的方法
        return "我叫{},年龄{}".format(self.name,self.age)

a=Per("张三",28)
print(str(a))  # 我叫张三,年龄28  # 张三,28  # 有str优先执行str方法,没有str方法执行repr备胎
print(repr(a))  # 我叫张三,年龄28
class Per():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return "{},{}".format(self.name, self.age)
    def __repr__(self):  # 复写了父类的方法
        return "我叫{},年龄{}".format(self.name,self.age)

a=Per("张三",28)
print(str(a))
print("我说: %r"%(a))  # 我说: 我叫张三,年龄28 # 找的是repr
print("我说: %s"%(a))  # 我说: 张三,28  # 找的是str
print(repr(a))  # 我叫张三,年龄28

class Stu():
    # 实例化,实际上是创建一个新的对象
    def __new__(cls, *args, **kwargs):  # 生产汽车
        print("111111")
        return object.__new__(cls)  # 用object类,去创建一个此类的对象实体cls,代表的是本类
    def __init__(self,name,age):  # 初始化的时候触发  # 对汽车进行修饰,
        print("222222")
        self.name=name
        self.age=age
zs=Stu("张三",18)
print(zs.name)

a=[1,2,3]
b=[1,2,3]
print(a==b)  # True
print(a is b)  # False
print(id(a))  # 30237320
print(id(b))  # 30237384
class Stu():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __eq__(self, other):
        print("333333")
        return self.__dict__==other.__dict__  # 比较字典内容相等

a=Stu("张三",19)
#print(a.__dict__)  # {'name': '张三', 'age': 19}
b=Stu("张三",19)
c=Stu("李四",20)
print(a==b)  # False  # 没有def eq 那两行是全方位比较,False  ;有的话就是比较字典里的内容,值相等
print(a==c)  # False
print(a)
print(b)
print(a is b)  # False  # 内存地址不一样

d=[]
d.append(a)
if b not in d:
    d.append(b)
print(d)

class Stu():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __eq__(self, other):
        print("self",self.__dict__)  # self {'name': '张三', 'age': 19}  # a
        print("other",other.__dict__)  # other {'name': '张三', 'age': 19}  # b
        b=self.__dict__==other.__dict__  # # 比较字典内容相等
        return b
a=Stu("张三",19)
#print(a.__dict__)  # {'name': '张三', 'age': 19}
b=Stu("张三",19)
print(a==b)  # True

a=42  # 仅仅只针对于整数字符串,相等
print(id(a))
b=42
print(id(b))

a=[1,2,3]
b=[1,2,3]
print(id(a[0]))
print(id(b[0]))

a={'a','b',[1,2,3]}
print(a)  # 集合要求里面数据类型可哈希,列表不行
class Stu():
    def __init__(self,name):
        self.name=name
a=Stu("张三")
b=Stu("李四")
c=Stu("王五")
#s={a,b,c}
#print(s)
print(hash(a))
print(id(a)/16)

class Stu():
    def __init__(self,name):
        self.name=name
    def __eq__(self, other):
        return self.name==other.name
    def __hash__(self):  # 删掉hash这两行报错,不可hash类型,
        return hash(self.name)
a=Stu("张三")
b=Stu("李四")
c=Stu("张三")
#print(id(a))  # 35205864
#print(id(b))  # 35205752
#print(id(c))  # 35209000
print(hex(id(a)))  # 0x1df32e8
print(hex(id(b)))  # 0x1df3278
print(hex(id(c)))  # 0x1df3f28
#print(a==b)  # False
#print(a==c)  # True
d={a,b,c}  # set()通过hash 和 eq 来去重
print(d)  #  {<__main__.Stu object at 0x0000000001DF3278>, <__main__.Stu object at 0x0000000001DF32E8>}
class A():
    pass
class B(A):
    pass
print(issubclass(B,A))  # B是A的子类吗?  True

class A():
    pass
class C():
    pass
a=A()
b=isinstance(a,A)
print(b)  # True
b=isinstance(a,C)
print(b)  # False
class A():
    xiaogou=10
    @staticmethod
    def hehe(num):
        print("我的数是",num)

delattr(A,'xiaogou')  # 删除A里面xiaogou属性

b=hasattr(A,'xiaogou')  # A里面有小狗这个属性
print(b)  # True

c=getattr(A,"xiaogou")  # A里面获取xiaogou的值
print(c)  # 10

a=A()
print(A.__dict__)
f=getattr(A,"hehe")  # 除了获取属性外还可以获取方法
f(9)

class A():
    def f1(self):
        print("我是f1")
    def f2(self):
        print("我是f2")
    def f3(self):
        print("我是f3")
print(A.__dict__)
a=A()
while True:
    f=input("请输入你想要调用的方法:")
    if hasattr(A,f):
        fc=A.__dict__.get(f)
        print("A类有:",f)
        fc(a)
    else:
        print("A类没有:",f)

class A():
    xiaogou=199
print(A.__dict__)
setattr(A,"zhutou",200)
print(A.__dict__)

a=A()
print(a.__dict__)
setattr(a,"haha",1999)
print(a.__dict__)
a.hehe=2022


import demo

x=getattr(demo,'d')
print(x)

f=getattr(demo,'func')
f("胡巴")

lei=getattr(demo,'A')
a=lei("张三")
print(a.name)
import sys

def haha():
    print("hehehehe")

zhutou=299
print(sys.modules)
print(sys.modules['__main__'])  # <module '__main__' from 'D:/python project/第三周/第二天/7月30号.py'>  # 字典
x=getattr(sys.modules['__main__'],'zhutou')
print(x)  # 299
x=getattr(sys.modules['__main__'],'haha')
x()

a=[1,2,3,4,5,6,7,8,9,10]
i=0  # 下标
count=0  # 数1,2,3
j=0  # 记0的个数
while True:
    if a[i] != 0:  # 只有未设置成0的数才参与报数
        count+=1  # 报数
        if count==3:  # 如果报数为3,那么让其出局,设置为0
            count=0
            a[i]=0
            j+=1
            if j==9:
                break
    i=(i+1)%len(a)  # 下标从0往后走,遇到10,重新变为0
print(a)

for i in range(6):
    for j in range(6 - i):
        print(" ", end=" ")
    for k in range(2*i+1):
        print("*",end=" ")
    print()



for i in range(6):
    for j in range(6 - i):
        print(" ", end="")
    for k in range(2*i+1):
        if k==0 or k==2*i or i==5: # 第一个和最后一个打印*,第六行打印*号
            print("*",end="")
        else:
            print(" ",end="")
    print()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python的魔术方法是以双下划线开头和结尾的方法,也被称为Magic Method(魔术方法)。这些方法在Python中具有特殊的功能和行为。魔术方法包括类的初始化方法__init__、比较方法、数值处理方法、普通算术操作符等等。魔术方法的作用是为了增强类的功能和灵活性,使对象能够具有更复杂的行为和操作。比如__init__方法用于初始化一个对象的状态,__str__方法定义了对象在被str()函数调用时的行为,__repr__方法定义了对象在被repr()函数调用时的行为等等。通过合理使用魔术方法,我们可以更好地控制和定制自己的类和对象的行为。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python的魔术方法大全](https://blog.csdn.net/qq_40236497/article/details/125539436)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python魔术方法详解](https://download.csdn.net/download/weixin_38501610/12879041)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值