15.魔法方法

1.构造和析构:魔法方法总是被下划线包围例如_init_,其”魔力“体现于总能够在适当的时候被自动调用。
(1)__init__构造函数:初始化或实例化变量

class Rectangle:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def getPeri(self):
        return (self.y + self.x) * 2
    def getArea(self):
        return self.x * self.y
rect=Rectangle(3, 4)
print(rect.getPeri())  # 14
print(rect.getArea())  # 12

此函数返回是None,不可以直接正常使用return返回。

class A:
    def __init__(self):
        return 3224
a=A()
Traceback (most recent call last):
  File "C:/Users/TangJingJing/PycharmProjects/untitled1/111.py", line 4, in <module>
    a=A()
TypeError: __init__() should return None, not 'int'

(2)new(cls[,…])函数:一般处于__init__函数之前,给返回实例对象一般默认执行,当继承不可变类型时但需要修改时需要重写。

class Capstr(str):
    def __new__(cls, string):
        string=string.upper()
        return str.__new__(cls,string)
a=Capstr("asrdtfyguhijk")
print(a)
ASRDTFYGUHIJK

(3)析构函数__del__(self):用于销毁对象

class c:
    def __init__(self):
        print("234567")
    def __del__(self):
        print('sdfghjk')
c1=c()  # 234567
c2=c1
del c2
del c1  # sdfghjk

2.算术运算:利用__add__(self,other)方法和__sub__(self,other)方法进行加减运算。

class A(int):
    def __add__(self, other):
        return int.__add__(self,other)
    def __sub__(self, other):
        return int.__sub__(self,other)
a=A(4)
b=A(5)
print(a+b)  # 9
class A(int):
    def __add__(self, other):
        return int(self)+int(other)
    def __sub__(self, other):
        return int(self) - int(other)
a=A(4)
b=A(5)
print(a+b)  # 9
class A(int):
    def __add__(self, other):
        return self+other
    def __sub__(self, other):
        return self-other
a=A(4)
b=A(5)
print(a+b)  

这个代码运行会报错,因为会进行递归一直执行。
反运算,加上’r’当算术运算由于找不到第一个数的相应运算方法时,系统会自动转为其反运算方法。

class A(int):
    def __radd__(self, other):
        return int.__sub__(self,other)
a=A(4)
b=A(5)
print(a+b)  # 9
print(1+b)  # 4

此题开始a可以找到方法A不执行反运算,后面找不到执行反运算b-1.且对象的顺序也是十分重要的。

class A(int):
    def __rsub__(self, other):
        return int.__sub__(self,other)
a=A(4)
print(3-a)  # 1
class A(int):
    def __rsub__(self, other):
        return int.__sub__(other,self)
a=A(4)
print(3-a)  # -1

一元操作符:

一元操作符
neg(self)定义正号的行为 :+x
pos(self)定义负号的行为 :-x
abs(self)定义当被abs()调用的行为
invert(self)定义按位求反的行为

3.属性访问
(1)getattr(self,name):定义当用户试图获取一个不存在的属性时的行为
(2)getattribute(self,name):定义当该类的属性被访问时的行为
(3)setattr(self,name,value):定义当一个属性被设置时的行为
(4)deltattr(self,name):定义当一个属性被删除时的行为

class C:
    def __init__(self):
        self.x='qwer'
c=C()
print(c.x)  # qwer
print(getattr(c,'x','没有这个属性'))  # qwer
print(getattr(c,'y','没有这个属性'))  # 没有这个属性
class C:
    def __getattribute__(self, name):
        print('getattributa')
        return super().__getattribute__(name)
    def __getattr__(self, name):
        print('getattr')
    def __setattr__(self, name, value):
        print('setattr')
        super().__setattr__(name,value)
    def __delattr__(self, name):
        print("delattr")
        super().__delattr__(name)
c=C()
c.x
c.x=1
print(c.x)
del c.x
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)  # self.__dict__name=value

    def getAera(self):
        return self.width*self.height
r1=Rectangle(4,5)
print(r1.getAera())  # 20

4.描述符(Property的原理):将某种特殊类型的类的实例指派给另一个类的属性,其中特殊类型指至少实现以下三种方法中的一个,
(1)get(self,instance,owner):用于访问属性,它返回属性的值
(2)set(self,instance,value):将在属性分配操作中调用,不返回任何内容
(3)delete(self,instance):控制删除操作,不返回任何内容

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
test
test.x='X-man'
del test.x
getting... <__main__.MyDecriptor object at 0x00000237131A1390> <__main__.Test object at 0x00000237131A1400> <class '__main__.Test'>
setting... <__main__.MyDecriptor object at 0x00000237131A1390> <__main__.Test object at 0x00000237131A1400> X-man
deleting... <__main__.MyDecriptor object at 0x00000237131A1390> <__main__.Test object at 0x00000237131A1400>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值