面向对象——类的内置方法(魔法方法)

面向对象——类的内置方法(魔法方法)

什么是类的内置方法?

凡是在类内部定义,以 __ 开头,以 __结尾的方法都是类的内置方法,也称之为魔法方法

类的内置方法会在某种条件满足下自动触发

常用的内置方法

__ init __()

在调用类时自动触发。 通过产生的对象自动调用__ init__()

class Demo(object):
	def __init__(self):
    print("此处是__init__方法...")
deom_obj = Demo()	# 此处是__init__方法...

__ new__(cls, *args, **kwargs)

在__ init __触发前,自动触发

class Demo(object):

    def __init__(self):
        print("此处是__init__方法...")

    # __new__;在__init__触发前,自动触发
    def __new__(cls, *args, **kwargs):
        print("此处是__new__方法..")
        # Python内部通过object调用内部的__new__实现产生一个空对象
        return object.__new__(cls, *args, **kwargs)
    
demo_obj = Demo()
# 打印结果:
# 此处是__new__方法..
# 此处是__init__方法...

__ getattr __(self, item)

在 “对象.属性” 获取属性时,“属性没有” 时触发

class Demo(object):   
    # 在 “对象.属性” 获取属性时,属性没有时触发
    def __getattr__(self, item):
        print("此处是__getattr__方法...")
        return 'Boom'   # return 想要返回的值
deom_obj = Demo()
print(deom_obj.x)
# 打印结果:
# 此处是__getattr__方法...
# Boom

__ getattribute __(self, item)

在“对象.属性”获取属性时,有没有属性都会触发

class Demo(object):
    # 在“对象.属性”获取属性时,无论属性“有没有”都会触发
    def __getattribute__(self, item):
        print("此处是__getattribute__方法...")
        return item
    
deom_obj = Demo(5)
print(deom_obj.x)
# 打印结果:
# 此处是__init__方法...
# 此处是__getattribute__方法...
# x

__ setattr __(self, key, value)

当“对象.属性 =属性值 ” 添加或修改属性时触发

class Demo(object):

    def __init__(self, x):
        self.x = x
        print("此处是__init__方法...")
        
    def __setattr__(self, key, value):
        print("此处是__setattr__方法...")
        print(key, value)
        # 此处是对对象的名称空间---> 字典进行操作
        self.__dict__[key] = value
        print(key, value)

deom_obj = Demo(5)
deom_obj.y = 10
# 打印结果:
# 此处是__setattr__方法...
# x 5
# x 5
# 此处是__init__方法...
# 此处是__setattr__方法...
# y 10
# y 10

__ call __(self, *args, **kwargs)

在“对象+()”调用对象时触发

class Demo(object):
    def __call__(self, *args, **kwargs):
        print("此处是__call__方法...")
        # 调用对象时的返回值
        return [1, 2, 3]
deom_obj = Demo()
print(deom_obj())
# 打印结果:
# 此处是__call__方法...
# [1, 2, 3]

__ str __(self)

在打印对象时触发

class Demo(object):
    def __str__(self):
        print("此处是__str__方法...")
        return "111"

deom_obj = Demo()
print(deom_obj)
# 打印结果:
# 此处是__str__方法...
# 111

__ getitem __(self, item)

在对象通过“对象[key]”获取属性时触发

class Demo(object):
    # 在对象通过“对象[key]”获取属性时触发
    def __getitem__(self, item):
        print("此处是__getitem__方法...")
        print(item)
        return self.__dict__[item]

deom_obj = Demo()
deom_obj.x = 10
print(deom_obj["x"])
# 打印结果:
# 此处是__getitem__方法...
# x
# 10

__ setitem __(self, key, value)

在对象通过“对象[key] = value值”设置属性时触发

class Demo(object):
    # 在对象通过“对象[key] = value值”设置属性时触发
    def __setitem__(self, key, value):
        print("此处是__setitem__方法...")
        print(key, value)
        self.__dict__[key] = value
        
deom_obj = Demo()
deom_obj["x"] = 20
# 打印结果:
# 此处是__setitem__方法...
# x 20
posted @ 2019-11-29 17:56  小小小小小小小小小白  阅读(183)  评论(0编辑  收藏  举报