python常用魔术方法

常用魔术方法

方法 描述
_del_() 销毁魔术方法,触发时机:当一个对象在内存中被销毁的时候自动执行
_call()_ 可以让类的实例具有类似于函数的行为, 进一步模糊了函数和对象之间的概念。对象后面加括号,触发执行。即:对象() 或者 类()()
_repr_() 改变对象的字符串显示 ­ 此方法是str()的备胎,如果找不到str()就会找repr()方法。
_new_() 实例化魔术方法 触发时机: 在实例化对时触发 参数:至少一个cls 接收当前类 返回值:必须返回一个对象实例 作用:实例化对象 注意:实例化对象是Object类底层实现,其他类继承了Object的new才能够实现 实例化对象。
_str_() 使用print(对象)或者str(对象)的时候触发
_hash_() Hash算法,是将一个不定长的输入,通过哈希函 数变换成一个定长的输出,即哈希值。
# __del__()
class Test:
    def __init__(self):
        print('程序执行')
        print('你好')
    def __del__(self): #当程序执行完了执行del方法
        print('程序执行完了')
s = Test()
print('程序执行完了2')

'''
程序执行
你好
程序执行完了2
程序执行完了
'''

# __call__()
class Sum:
    def sum(self):
        a = 0
        i = 0
        while i < 101:
            a = a + i
            i += 1
        print(a)
    def __call__(self, *args, **kwargs):
        self.sum()
Sum()()
sum = Sum()
sum()
'''
5050
5050
'''

# __repr__()
class Str:
    def __init__(self,name,age):
        self.name = name
        self.age = age
    # def __str__(self):
    #     return '__str__() 姓名:%s age: %s' % (self.name, self.age)
    def __repr__(self):
        return '__repr__()姓名:%s age: %s' %(self.name, self.age)
per = Str('李明',18)
print(per)
#__repr__()姓名:李明 age: 18,当str方法不存在,会找repr方法

#__new__()
class Dog:
    def __new__(cls, *args, **kwargs):
        print('new') # 重写
        new = object.__new__(cls) # 调用父类object的new方法才创建new对象
        new.__init__()
        new.__del__()
    def __init__(self):
        print('int')
    def __del__(self):
        print('del')
d = Dog()
'''
new
int
del
del
'''
class Num:
    def __init__(self,num):
        self.num = num
n1 = Num(1)
n2 = Num(2)
n3 = Num(3)
lst = [n1,n2,n3]
set1 = set(lst)
print(set1)
{<__main__.Num object at 0x00000203CBA400C8>, <__main__.Num object at 0x00000203CBA401C8>, <__main__.Num object at 0x00000203CBA40248>}

hash()函数默认调用Object类的hash()方法。Hash值是对象的id值/16。

类的常用函数

方法 描述
issubclass() 检测一个类是否是另外一个类的子类 ,返回值布尔类型,格式issubclass(被检测类, 父类) ,或者issubclass(被检测类, (父类1,父类2, 父类3…))
isinstance() 检测一个对象是否是某个类的对象 ,返回值时布尔,issubclass(对象, 类),issubclass(对象, (类1,类2,类3)),只要一个类是当前对象对象的类,那么最终结果是True

反射方法

python面向对象中的反射:通过字符串的形式操作对象相关的属性 python中的一切事物都是对象(都可以使用反射)

方法 描述
hasattr() 判断是否有此变量,返回bool 值 ,hasattr(对象/类,‘成员名’)
getattr() 获取属性值或者获取方法变量的地址 ,getattr(对象,‘属性名’[,成员不存在时的默认值]), 返回成员的值
setattr() 给类或者对象设置属性或者方法 (少),setattr(对象,‘成员名’,值)
delattr() 删除类或者对象的属性或方法 (少),delattr(对象,成员)
class Teacher:
    name = '斯密斯'
    def __init__(self,name,age):
        self.name = name
        self.age = age
t = Teacher('haha',25)
print(hasattr(t,'name')) #判断是否有此变量
print(getattr(t,'name')) # 获取变量值
setattr(t,'adress','陕西') #添加
print(t.adress)
delattr(t,'adress') # 移除 'adress'
# print(t.adress)

True
haha
陕西

posted @ 2019-12-29 22:54  afly_8  阅读(50)  评论(0编辑  收藏  举报