属性相关的魔术方法

‘’’
属性相关的魔术方法:
就是获取成员,删除成员,修改成员相关联的魔术方法而已
五个与属性相关的魔术方法:
1. getattr
2. setattr
3. delattr
4. getattribute
5. dir

属性访问的顺序:
1. 调用__getattribute__
2. 调用数据描述符
3. 调用当前对象的所属成员
4. 调用类的所属成员
5. 调用非数据描述符
6. 调用父类的所属成员
7. 调用__getattr__

注意:以上步骤是对象调用某个成员的访问顺序及优先级,一旦的前面的能获取成员,就不会向后查找

  1. getattribute
    学习魔术方法的步骤:
    1. 触发时机:访问对象成员的时候就会触发,无论成员在与不在
    2. 作用:可以在用户获取数据的时候可以进行数据处理操作
    3. 参数:一个self接收当前对象,另外一个参数接收访问对象成员名称的字符串
    4. 返回值:有,不设定返回None
    5. 注意事项:在当前魔术方法中禁止使用 当前对象.成员 的方式访问,会触发递归循环
    必须借助object.__getattribute__来获取当前对象的成员

‘’’

‘’’
#声明一个类
class Human:
#属性 (加入对象)
def init(self):
self.sex = ‘女人’
self.eye = ‘2个’
self.skin = ‘黄色’
self.name = ‘小明’

#方法
#添加魔术方法__getattribute__
def __getattribute__(self,item):  # item 接收的是访问成员的名称字符串
    print('getattribute被触发了')
    #一定不能使用当前对象的成员访问,会再次触发当前魔术方法进入递归循环
    #使用最顶层上帝之手:object.来获取
    result = object.__getattribute__(self,'name')
    #隐藏用户名: (返回成员中间加上*号)
    newname = result[0] + '*' + result[-1]
    # 设置返回值
    return newname

def eat(self):
    print('吃饭')

def run(self):
    print('跑步')

def sleep(self):
    print('睡觉')

#实例化一个对象
ls = Human()
print(ls)

#访问对象的名称
print(ls.name)
‘’’

‘’’
2.getattr

学习魔术方法的步骤:
1. 触发时机:访问不存在的对象成员的时候自动触发
2. 作用:防止访问不存在成员的时候报错,为不存在的成员定义值
3. 参数:一个self接收当前对象,第二个参数接收访问成员的名称字符串
4. 返回值:可以有,也可以没有
5. 注意事项:木有

‘’’
‘’’
#声明一个类
class Human:
#属性 (加入对象)
def init(self):
self.sex = ‘女人’
self.eye = ‘2个’
self.skin = ‘黄色’
self.name = ‘小明’

#方法
#添加魔术方法__getattr__
def __getattr__(self,item):
    print('getattr方法被触发了')

    return 'xxxx'

def eat(self):
    print('吃饭')

def run(self):
    print('跑步')

def sleep(self):
    print('睡觉')

#实例化一个对象
df = Human()
print(df)

#访问对象的名称
print(df.name2) #访问一个不存在的对象成员的时候就会触发__getattr__并返回设置的返回值

‘’’

‘’’
2.setattr

学习魔术方法的步骤:
1. 触发时机:添加对象成员,或者修改对象成员的时候触发
2. 作用:可以限制或者管理对象成员的添加与修改操作
3. 参数:一个self接收当前对象,第二个参数接收访问成员的名称字符串
4. 返回值:可有可无
5. 注意事项:在当前魔术方法中禁止使用:当前对象.成员名 = 值的方式.会触发递归操作

‘’’

#声明一个类
class Human:
#属性 (加入对象)
def init(self):
self.sex = ‘女人’
self.eye = ‘2个’
self.skin = ‘黄色’
self.name = ‘小明’

#方法
#添加魔术方法__setattr__
def __setattr__(self,attrname,value):  #相当于在重载object中的_setattr__
    #print('setattr方法被触发了')
    # 1. 禁止修改性别,修改名称最多使用三个字符,多余的舍弃
    if attrname == 'sex':
        pass
    else:
        object.__setattr__(self,attrname,value)


    #return 'xxxx'

def eat(self):
    print('吃饭')

def run(self):
    print('跑步')

def sleep(self):
    print('睡觉')

#实例化一个对象
df = Human()
#修改成员信息
df.name = ‘西门吹牛’

#访问对象的名称
print(df.dict)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值