「这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战」
定制属性访问 (增,删,改,查)
就是对类里的属性进行增删改查的操作
(1)增
setattr(实例名,"属性名",值) 或者 实例名.属性 = 值
(2)删
delattr(实例名,"属性名") #只能删除自己家的属性
(3)改
setattr(实例名,"属性名","新属性") #有这个属性才可以修改
(4)查
hasattr(实例名,"属性名") #返回布尔值,有就True,没有就False
或者
getattr(实例名,"属性名") #存在就能取到这个值,不存在就报错
可以用成 实例名.getattr("属性名") 上面的几个也可以(因为在python里面已经定义好了,已经有源码),但是hasattr不可以,没有这个方法。
但是用这种方法时,要在类里面定义这种方法。(重写方法)
例如:
def __getattribute__(self,item):
return "属性不在"
把这个写在类里面作为一个方法。
重写一个源码,python会返回你重写的这个方法的返回值,而不会再执行源码。
举例说明:
class Rectangle:
#__init__不能使用return
def __init__(self,length,width):
self.length = length
self.width = width
def area(self):
#使用self 那个实例去使用它,它就是谁
return(self.length*self.width)
a = Rectangle(4,5)
################查
#判断实例有没有这个属性
print(hasattr(a,'length')) #输出aTrue
#实例的这个属性值是什么 获取值,没有就报错
print(getattr(a,'length')) #输出4
################改
setattr(a,'width',50) #本来应该是5,现在改成了50
#还可以写成: a.setattr('width', 50)
print(getattr(a,'width')) #输出就是50
################增
#第一种:
#setattr 有则改,无则增
print(hasattr(a,'name')) #在这里实例a里面没有属性name。输出False
setattr(a,'name','hansha') #没有就增加属性name
#还可以写成:a.setattr('name', 'hansha')
print(hasattr(a,'name')) #上一句增加了name属性。输出True
#第二种:
a.age = 18
################删
print(getattr(a,'age')) #因为上面增加了属性age。输出为True
delattr(a,'age') #删除属性age
#还可以写成:a.delattr('age')
print(getattr(a,'age')) #上面删除了属性age。输出为False
拓展:
(1) + 调用的是__add__
class A:
def __init__(self,num1,num2):
self.num1 = num1
self.num2 = num2
def __add__(self,other): #self 实例对象 ; other 另外一个实例对象
sum1 = self.num1 + other.num1
sum2 = self.num2 + other.num2
return sum1,sum2
a = A(1,2)
b = A(3,4)
print(a+b) #输出为 (4,6)
运算符方法(了解即可)
add(self,other) # x+y
sub(self,other) # x-y
mul(self,other) # xy
mod(self,other) # x%y
iadd(self,other) # x+=y
isub(self,other) # x-=y
radd(self,other) # y+x
rsub(self,other) # y-x
imul(self,other) # x=y
imod(self,other) # x%=y
每天坚持学习,坚持记笔记——好记性不如烂笔头。
加油加油!