魔术方法笔记0-1

#__init__ 魔术方法

'''
触发时机:实例化对象后自动触发
功能:对对象进行成员属性的设定(成员归对象所有)
参数:由一个self接收当前对象,其余根据需求决定
返回值:不需要


import random
class Human:
    #属性
    name = '张三'
    sex = '男'
    age = 18
    color = 'yellow'
    #方法
    def __init__(self,newname):
        #print('init执行')
        if random.choice(['男','女']) == '男':
            self.sex ='男'
        else:
            self.sex='女'
        self.name = newname
    def eat(self):
        print('我喜欢吃虾爬子')
    def drink(self):
        print('我喜欢喝山泉水')
#实例化对象
ld = Human('我') #1.制作对象   2.初始化对象(初步处理)
print(ld.__dict__)


#__new__  魔法方法
'''
触发时机:实例化对象的过程当中触发
功能:根据事情情况决定是否产生对象
参数:一个cls接收当前类,其余根据需求决定(new魔术方法的参数和init的参数一样)
返回值:可有可无
'''

class Human:
    #属性
    age = 0
    color = 'yellow'
    #方法
    def __new__(cls,familyName): #实际操作相当于重载object中的__new__方法
      #print(cls)  #cls表示当前类
    #判断是否姓王
        if familyName == '王':
            return object.__new__(cls)
        else:
            return None


#实例化对象
x = Human('王')  #制作对象  #初始化对象(初步处理
print(x)


#__del__ 魔术方法
'''
触发时机:当对象从内存中被移除的时候自动触发
1.系统回收所有资源,页面结束  2,所有该对象的变量,都被删除的时候
功能:回收系统资源
参数:一个self接收当前对象
返回值:无

'''

class Human:
    #属性
    color = 'yellow'
    age = 12
    #方法
    def eat(self):
        print('咖啡')

    #魔术方法
    def __del__(self):
        print('del被触发')

#实例化对象
jr = Human()  #不是这里触发的
#将多个变量指向对象
xj = jr #两者都是使用同一个对象
#从内存中删掉对象
del jr #删除变量  内存会回收资源
del xj
print('-----')


#__call__ 魔术方法

#触发时机:将对象当做函数调用自动触发时机
#功能:代替一个方法的名称,为操作提供快捷方式
#参数:一个self
class ReadFile:
    #打开文件
    def __init__(self,path):
        #设定读取的文件路径
        self.filepath = path
        #打开文件(将文件指针存入当前对象)
        self.fp = open(self.filepath,'r')

    #读取文件  (只读取操作)
    def __call__(self, askNums):
        result = self.fp.read()
        #检测是否需要打印字数
        if askNums == True:
            print(result,len(result))
        else:
            print(result)


        #关闭文件
    def __del__(self):
        self.fp.close()


#实例化对象
rf = ReadFile('C:\\Users\\cz\\Desktop\\ip.txt')
#将对象当做函数调用
jg =rf(True)


#__len__ 魔术方法
'''
触发时机:使用len检测对象的时候自动触发
功能:计算某个事物的长度
参数:一个self 接收当前对象
返回值;必须是一个整数
'''

class Human:
    #属性
    age = 10
    color = '黄色'
    eye = 2
    #方法
    def eat(self):
        print('hhah')
    def __len__(self):
        print('len魔术被调用')
        print(Human.__dict__) #获取类的所有成员  字典
        #过滤出来所有自定义成员
        allmember = {k : v for k,v in Human.__dict__.items() if not(k.startswith('__')and(k.endswith('__')))}
        return len(allmember)


#实例化对象
juzi = Human()
#len()   检测对象
result = len(juzi)  #出发魔术方法len
print(result)

#__str__ 魔术方法
'''
触发时机:使用print()   打印对象的时候或者使用str() 转换对象的时候自动触发
功能;设置对象打印时候的值
参数;一个self接收当前对象
返回值;必须是字符串类型
'''

class Jia:
    #属性
    sex = '女'
    #定义打印对象的结果
    def __str__(self):
        return 'hello'

#实例化对象
j = Jia()
#直接打印对象
print(j)

result = '我'+str(j)+'实习'
print(result)

#__repr__ 魔术方法
'''
触发时机;使用repr()  操作对象时自动触发
功能:设置repr()   操作对象的返回结果
参数:一个self接收当前对象
返回值:必须是字符串
'''

class Zhang:
    #成员属性
    sex = '男'

#定义repr魔术方法
    def __repr__(self):
        return '$$hello%%'
#类中默认都有一句话
#__str__ = __repr__

#定义str的魔术方法
    def __str__(self):
        return '3.4cm'

#实例化对象
zl =Zhang()
print(zl)

#repr()
result =repr(zl)
print(result)

#___bool__ 魔术方法
'''
触发时机: 使用bool转换对象的时候自动触发
功能:检测成员的状态
参数:一个self接收当前对象
返回值;必须是布尔值
'''

class Pei:
    #属性
    married = '单身'
    #方法
    def __bool__(self):
        #判断此人是否已婚
        if self.married == '已婚':
            return True
        else:
            return False

#实例化对象
p =Pei()
result = bool(p)
print(result)


#__format__ 魔术方法
'''
触发时机: 使用format操作对象的时候时候自动触发
功能;定义format操作对象的方式
参数:一个self接收当前对象,一个形参接收format的限定符号
'''

class SunYuWei:
    #属性
    name = 'hello'
    #方法
    def __format__(self, sign):
        print(sign)
        #获取标志内容
        fillchar = sign[0]
        align = sign[1]
        total = int(sign[2:])#将字符串转换为整数
        print(total,type(total))
        #判断对齐方式
        if align =="^": #居中对齐
            result = self.name.center(total,fillchar)
        elif align == ">": #右对齐
            result = self.name.rjust(total,fillchar)
        elif align == "<": #左对齐
            result = self.name.ljust(total,fillchar)
        else:
             'mmp'
        return result
#实例化对象
lw = SunYuWei()
#使用format函数
str1 = '一起he{:^10}去吃饭'
result =str1.format(lw)
print(result)

描述符相关的魔术方法

1.__get__()

触发时机:在获取指定描述符操作的成员属性的值的时候触发

参数:1描述符对象本身,2描述符描述的属性所在的对象,描述符描述的对象的类

返回值:必须有,不然无法获取相应属性值

注意:仅在描述符中使用

2.__set__()

触发时机:在设置或者添加指定描述符操作的成员属性的时候触发

参数:1描述符对象本身,2描述符描述的属性所在的对象,3要设置的值

返回值:无

注意:仅在描述符中使用

3.__delete__()

触发时机:在删除指定描述符操作的成员属性的时候触发

参数:1描述符对象本身,2描述符描述的属性所在的对象

返回值:无

注意:仅在描述符中使用

#描述符
#掌管成员属性操作的类
class MSF:
    #建立一个代替成员属性的临时属性(稻草人)
    def __init__(self):
        #就是在描述符类中代替username进行操作
        self.var = '张勒'
    #获取成员属性
    def __get__(self,obj,cls):#self 当前描述赋的对象  obj邮箱对象   cls邮箱类
        #用户名获取的相关处理(隐藏中间文字,只显示开头和结尾)
        result = self.var[0]+'*'+self.var[-1]
        return  result

    #设置成员属性
    def __set__(self,obj,value):
        #设置值,可以添加条件,内容的修饰操作
        self.var= value

    #删除成员属性
    def __delete__(self, obj):
        #通过邮箱对象判断用户名是否允许删除
        if obj.isallowdel == True:
            #将self.var删除  相当于删除了username
            del self.var
        else: #不允许删除
            pass
class Email:
    #成员属性
    username = MSF()  #操作的内容   #将用户名交给描述符的一个【对象】掌管
    password = '123445'
    #是否允许删除用户名
    isallowdel = False

    #成员方法
    #登录
    def login(self):
        print('登录邮箱')
    #退出
    def logout(self):
        print('退出登录')

#实例化对象
e = Email()
#获取用户名
#print(e.username)
#设置用户名
#e.username = '小婷'
print(e.username)

#删除用户名
del e.username
print(e.username)



例子2:
#描述符

#邮箱类/描述符的内容
class Eamil:
    # 成a员属性
    #username = '匿名用户'
    password = '12346789'
    # 是否允许删除用户名
    isallowdel = False

    # 成员方法
    # 登录
    def login(self):
        print('登录邮箱!')

    # 推出
    def logout(self):
        print('推出登录')


    def __init__(self):

        #设置一个用于在描述符中管理用户的映射变量
        self.var = '张科'
    #获取
    def fget(self):
        return self.var
    #设置
    def fset(self,value):
        self.var = value
    #删除
    def fdelete(self):
        del self.var
    #将username交接给描述符(必须在三个方法之后
    username =property(fget,fset,fdelete)

#
#实例化邮箱对象
e = Eamil()
#获取操作
print(e.username)
#设置操作
e.username='胡宏毅'
print(e.username)
#删除操作
del e.username
print(e.username)
#单例设计模式:一个类智能实例化一个对象
class Zhongju:
    #属性
    sex = "女"
    age = 19
    size = '33'
    obj = None #未来存储对象的成员属性
    #方法
    #需要new魔术方法
    def __new__(cls):
        #第一次制作对象
        if cls.obj == None:
            obj = object.__new__(cls)
            #将当前对象存入类中
            cls.obj = obj
            #返回对象
            return cls.obj
        else:
            #直接返回类中制作好的对象
            return cls.obj

#实例化对象
z1 = Zhongju()
print(z1)
z2 =Zhongju()
print(z2)

与属性操作相关的魔术方法

1.__getattr__()
触发时机:获取不存在的对象成员时触发
参数:1个接收当前对象的self,一个是获取成员名称的字符串
返回值:必须有值
作用:为访问不存在的属性设置值
注意:getattribute无论何时都会在getattr之前触发,触发了getattribute就不会在触发getattr了
例子:

#属性操作的魔术方法
class Human:
    #属性
    def __init__(self):
        self.xingbie = '男'
        self.age = 18
        self.color = 'red'

    '''
    触发时机:访问不存在的成员属性的时候自动触发
    功能:设置不存在的属性的访问结果,可以防止程序报错
    参数:可有可无
    '''
    def __getattr__(self, attrname):
        #为不存在属性设置不同的值
        if attrname == 'name':
            return '匿名用户'
        elif attrname == 'size':
            return '33'
        elif  attrname =='sex':
            return 'xingbie'
        else:
            return False

#实例化对象
juzi = Human()
#访问成员属性
print(juzi.name)
print(juzi.age)

2.__setattr__()
触发时机:设置对象成员值的时候触发
参数:1个当前对象的self,一个是要设置的成员名称字符串,一个是要设置的值
返回值:无 过程操作
作用:接管设置操作,可以在设置前之前进行判断验证等行为
注意:在当前方法中无法使用成员=值的方式直接设置成员,否则会无限递归,必须借助object的设置方法来完成

object.__setattr__(参数1,参数2,参数3)

class Human:
    age =14
    #重载了object的操作
    def __setattr__(self,attrname,attrvalue):
        #print(attrvalue,attrname)
        #我们无法自行设置,否则会递归,需要object来实现
        if attrname == 'age':
            object.__setattr__(self,attrname,attrvalue)
        elif attrname == 'wing':
            pass

#实例化对象
juzi = Human()
#设置成员属性
juzi.age = 16
juzi.wing = '留意'
print(juzi.__dict__)

3.__delattr__()
触发时机:删除对象成员时触发
参数:一个当前对象的self
返回值:无
作用:可以在删除成员时进行验证。
class Human:
    #属性
    def __init__(self):
        self.xingbie = '男'
        self.age = 18
        self.color ='red'
        #方法
        def __delattr__(self, attrname):
            print('delatter')
            #验证成员是否被删除
            if attrname == 'xingbie':
                pass
            elif attrname == 'color':
                #借助object来删除
                object.__delattr__(self,attrname)

#实例化对象
jiarui =Human()
print(jiarui.__dict__)
del jiarui.xingbie
print(jiarui.__dict__)

4.__getattribute__()
触发时机:使用对象成员时触发,无论成员是否存在
参数:1个接收当前对象self,一个是获取的成员的名称字符串
返回值:必须有
作用:在具有封装操作(私有化时),为程序开部分访问权限使用

#人类
class Human:
    #属性
    sex = '男'
    age = 18
    #私有成员
    __heart = '心脏'
    __jj = '3.5CM'

    #方法
    def __getattribute__(self, item):
        #判断哪些成员可以返回
        def __getattribute__(self, attrname):
            # 判断哪些成员可以返回
            if attrname == '__heart':
                return self.__heart
            return object.__getattribute__(self, attrname)



#实例化对象
z =Human()
#访问成员属性
print(z.aaa) #成员属性不存在
print(z.sex)  #成员属性存在
print(z.age)
5.__dir__()
触发时机:dir(对象)的时候触发
参数:1个接收当前对象self
返回值:必须为序列类型(列表,元组,集合等,)
作用:可以自定义成员列表的返回值
class Human:
    #属性
    color = 'yellow'
    #方法
    def __init__(self,name):
        self.name =name
    def __dir__(self):
        print('dir被触发')
        #获取所有的可以访问的列表
        result = object.__dir__(self)
        #过滤数据,保留非魔术方法内容
        newlist = [i for i in result if not(i.startswith('__')and i.endswith('__'))]
        return newlist


#实例化对象
jr = Human('宏毅')
result = dir(jr)
print(result)







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值