python之面向对象之魔术方法

一,魔术方法(魔术方法,特殊方法)https://www.cnblogs.com/nmb-musen/p/10861536.html

1,__init__作用

在创建对象的时候自动调用对 创建的对象 进行初始化设置

2,什么是魔术方法

在python中像__init__这类双下划线开头和结尾的方法,称之为魔术方法

注意:魔术方法都是python内部定义的,自己不要去定义__init__这种双下划线开头的方法

3,创建一个对象的时候,调用的第一个方法是什么?

__new__方法,创建并返回一个实例对象(存在于父类object中),创建的实例对象让init函数初始化

在重写new方法时,一定要调用父类的new方法来完成对象的创建,并且将对象返回

class MyClass(object):
    def __init__(self, name):
        self.name = name
        print('__init__方法调用了')

    def __new__(cls, *args, **kwargs):
        print('这个是new方法')
        # 第一种 调用父类方法并返回
        # return super().__new__(cls)
        # 第二种,调用父类object
        return object.__new__(cls)


m = MyClass('小鱼')
print(m.name)

4,这个__new__方法有什么作用?又在什么时候会调用呢?

单例模式中会用到

 二,单例模式

需求:类每次实例化的时候都会创建一个对象,如果要求类只能实例化一次该怎么做?

class MyTest(object):
    # 设置一个类属性用来记录这个类有没有创建过对象
    instance = None

    def __new__(cls, *args, **kwargs):
        if not cls.instance:
            cls.instance = object.__new__(cls)
            return cls.instance
        else:
            return cls.instance

t1 = MyTest()
t1.name = '小鱼'

t2 = MyTest()
print(t2.name)

# t1和t2对象的内存地址是一样的
print(id(t1) == id(t2))

装饰器实现单例模式

1,python的内置函数__str__,__repr__,format

一般str方法是给用户看的,repr调式用的,接近对象创建的内容

使用print打印时触发__str__方法

交互环境直接输入变量时触发的时__repr__方法

注意点:

重写__str__ __repr__方法时必须要记得写return

重写__str__ __repr__方法时,return返回的必须是一个字符串对象

class MyTest:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        print('__str__方法被触发了')
        return self.name

    def __repr__(self):
        print('__repr__方法被触发了')
        return '<MyTest.obj-{}>'.format(self.name)

t1 = MyTest('小鱼')
# 调用__str__方法
print(t1)
# 调用__repr__方法
res = repr(t1)
print(res)

内置函数str转换一个对象时,触发对象对应__str__方法

内置函数format处理对象时,触发对象对应__str__方法

内置函数repr函数,触发对象的__repr__的方法

__str__和__repr__触发机制

总结:

使用str函数或者print打印对象时会优先触发str方法,没定义str方法的情况下,会再去找repr方法,如果都没有,那么会去找父类的str方法

使用repr方法或者交互环境下输入变量,会先找自身的repr方法,自身没有repr方法,会再去找父类额repr方法

2,__call__方法

在python中万物皆对象,那为甚函数可以被调用,其他对象却不能被调用?

通过类实现装饰器要用到__call__方法

class Decorator:

    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print('这是装饰器里面的功能')
        self.func()

# test = Decorator(test)
# 1,相当于创建了一个对象,赋值给test
# 2,test()相当于调用对象,对象如果可以被调用,通过call方法实现
# 3,创建Decorator对象时传进去的函数会被init方法接收

@Decorator
def test():
    print('---原来的功能函数---')
原文地址:https://www.cnblogs.com/ella-li/p/13977485.html