魔法方法:一个类/对象中的方法,在特定的时刻自动触发。
触发时机:初始化对象时触发
参数:至少一个self用于接受对象
返回值:无
作用:初始化对象的成员
注意:该方法是为对象初始化,类不拥有初始化的成员
- import random
-
- class Human:
- #属性
- age = 0
- color = 'yellow'
-
- #方法
- def __init__(self,newname):
- #print(self)
- #print('init方法执行了')
- #初始化性别
- if random.choice(['男','女']) == '男':
- self.sex = '男'
- else:
- self.sex = '女'
- #初始化姓名(给对象添加了一个name的成员属于型)
- self.name = newname
- def eat(self):
- print('我爱吃麻小!')
-
- def drink(self):
- print('我爱快乐水')
-
- #实例化对象
- ld = Human('小明')#1.制作对象 2.初始化对象(初步处理!)
- print(dir(ld))
- print(dir(Human))
触发时机:实例化时触发
参数:至少一个cls 接受当前类
返回值:必须返回一个对象的实例
作用:实例化对象
注意:实例化对象是object类底层实现 ,其他类继承了object的__new__方法才能实现实例化对象
- class Human(object):
- #属性
- age = 0
- color = 'yellow'
- #方法
- def __new__(cls,familyName):#实际操作相当于重载object中的__new__方法
- #print(cls)#cls表示当前的类
- #print('new方法被触发!')
-
- #判断是否姓王,姓王就生出对象,否则就不出生
- if familyName == '王':
- #借助object中的制作对象的__new__来实例化对象!(如果用cls('王')实例化对象会递归调用重载方法__new__)
- return object.__new__(cls)
- else:
- return None
-
- def eat(self):
- print('我爱吃麻小!')
-
- def drink(self):
- print('我爱快乐水')
-
-
- #实例化对象
- xtd = Human('王')#1.制作对象 2.初始化对象(初步处理!)
- print(xtd)
触发时机:当对象没有任何变量的引用的时候被触发
参数:一个self接受对象
返回值:无
作用:使用完对象时回收资源
注意:只有当前对象没有任何变量接收时才会被触发
- class Human:
-
- #属性
- color = 'yellow'
- age = 0
- #方法
- def __del__(self):
- print('__del__方法被调用')
-
- h=Human()
- x=h #只有当前对象没有任何变量接收时才会被触发
- del h
- print('程序结束')
触发时机:将对象当作函数调用( 对象() )时触发
参数:至少一个self接收对象 其余根据调用时参数决定
返回值:根据情况而定
作用:可以将复杂的步骤进行合并操作,减少调用步骤 类做装饰器用__call__方法实现
- class Sleep:
- #外层函数
- def __init__(self,arg):
- #print(arg)
- #如果有参数究存入对象方便其他方法使用
- self.arg = arg #可有可无
-
- #装饰器函数
- def __call__(self,func):
- #print(func)
- #将基本函数存入对象
- self.func = func
-
- #返回inner函数
- return self.inner
-
- #未来的inner函数的方法
- # 制作内部函数inner
- def inner(self):
- # 扩展功能1
- print('----1----------')
- # 基本功能
- self.func()
- # 扩展功能2
- print('--------2---------')
-
-
- @Sleep('la')#@Sleep()-> @对象 @装饰器函数 ===> xxoo=sleep('la')(xxoo)
- def xxoo():
- print('--------3-----------')
-
- #调用函数
- xxoo()
触发时机:使用len(对象) 的时候触发
参数:一个参数self
返回值:必须是一个整型
作用:可以设置为检测对象成员个数,但是也可以进行其他任意操作
注意:返回值必须必须是整数,否则语法报错,另外该要求是格式要求。
- class Human:
-
- #属性
- age = 0
- color = 'yellow'
- eye = 2
- finger = 10
-
-
- #方法
- def eat(self):
- print('---1----')
-
- def tian(self):
- print('---2----')
-
- #魔术方法__len__
- 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)
触发时机:使用print(对象)或者str(对象)的时候触发
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
- class JiaRui:
- #属性
- sex = '女'
- age = 18
- color = 'white'
- weight = 90
-
- #方法
- def smile(self):
- print('---------1--------')
-
- def cry(self):
- print('------2---------')
-
- #定义打印对象的结果
- def __str__(self):
- print('str魔术方法被触发')
- #必须返回一个字符串
- return '漂亮'
-
-
- #实例化对象
- jr = JiaRui()
-
- #直接打印对象
- #print(jr)
-
- result = '我很'+str(jr)+'!'
- print(result)
触发时机:在使用repr(对象)的时候触发
参数:一个self接收对象
返回值:必须是字符串
作用:将对象转使用repr化为字符串时使用,也可以用于快捷操作
- class Zhangsan:
- #成员属性
- sex = '男'
- age = 28
- length = '3.5cm'
- color = 'yellow'
-
-
- #成员方法
- def lang(self):
- print('张3一头大波,浪')
-
- #定义repr魔术方法
- def __repr__(self):
- #print('repr被触发')
- return '&&&&&&&&&&3.5cm小33&&&&&&&&'
-
- #类种默认都有一句话
- #__str__ = __repr__
-
- # 定义repr魔术方法
- def __str__(self):
- # print('repr被触发')
- return '******3.5cm小33********'
-
- #实例化对象
- z3 = Zhangsan()
-
- #print()
- print(z3)
-
- #repr()
- result = repr(z3)
- print(result)
str的结果 字符串本身 (结果可以被eval执行)
如:x = '无图言Diao' str() ->无图言Diao
rerpr的结果 字符串定义结构 (eavl不会执行repr结果)
如:x = '无图言Diao' repr() ->'无图言Diao'
备注: 在类中通常情况下__str__和__repr__ 设置相同即可
eval()
函数 将字符串当作python代码执行
格式:eval(字符串)
返回值:可以有返回值
触发时机: 使用bool(对象)的时候触发
参数:一个self接收对象
返回值:必须是布尔值
作用:根据实际情况决定,可以作为快捷方式使用
注意:仅适合于返回布尔值的操作
- class zhangsan:
- #属性
- sex = '男'
- age = 28
- married = '离异'
-
- #方法
- def eat(self):
- print('------------1---------')
-
- def say(self):
- print('----------2----------')
-
- #bool转换对象:输出这个人是否已婚
- def __bool__(self):
- #print('bool被触发')
- #判断此人是否已婚
- if self.married == '已婚':
- #必须返会布尔值
- return True
- else:
- return False
-
- #实例化对象
- phx = zhangsan()
-
- #
- result = bool(phx)
- print(result)
触发时机:使用字符串.format(对象)时候触发
参数:一个self接收对象,一个参数接收format的{}中的格式,例如:>5
返回值:必须是字符串
作用:设置对象可以作为format的参数,并且自定义对象格式化的规则
- class zhangsan(object):
- #属性
- sex = '男'
- age = 18
- name = '帅哥'
-
- #方法
- def eat(self):
- print('----------1-----------')
-
- def say(self):
- print('---------------2---------')
-
- # __format__魔术方法
- def __format__(self,sign):
- #print('format被触发')
- #print(sign)
- '''
- @>10 @填充符号 > 对其方式 10 字符总数
- > 右对齐 < 左对齐 ^ 居中对其
- '''
- #获取标志内容
- 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:
- return 'mmp'
-
- #返回一个字符串
- return result
-
- #实例化对象
- syw = zhangsan()
-
- #使用format函数
- str1 = '同{:~^10}一起去唱K!'
- result = str1.format(syw)
- print(result)