python魔术方法的使用(一)

一. 魔术方法总结

1.__str__,__repr__,__call__,__dir__,__dict__的使用

# 定义一个全局变量
m = 5

class Student(object):
    class_name = "3班"

    def desc(self):
        pass

    @staticmethod
    def mod_class(cls):
        pass

    def __str__(self):
        """
        使用print(self),或者str(self)时
        :return:
        """
        print("zhishi str")
        return "javk"

    def __repr__(self):
        """
        __str__不存在时才调用
        :return:
        """
        print("jack")
        return "mm"

    def __call__(self):
        """
        使用self()调用
        :return:
        """
        print("这是call方法")


a = Student()

# 使用print打印对象的时候实际是:print(a__str__()),若是没有__str__()就调用__repr__()
print(a)  # 输出结果: zhishi str \n javk

# a()等同于a.__call__()
a()    # 输出结果:这是call方法

# __dir__()方法是输出对象中所有的属性名和方法名称,也可以这样调用 dir(self)
a.name = "老王"
print([i for i in a.__dir__() if not i.startswith("_")])  # 输出结果:['name', 'class_name', 'desc', 'mod_class']
print(a.__dir__()) # 输出结果:包括魔术方法在内的 ,等同于:print(dir(a))

# __dict__属性:返回对象内部的所有属性和属性值
a.name = "老王"
print(a.__dict__)   # 输出结果:{'name': '老王'}

  1. __setattr__,__getattr__,__getattribute__的使用

class Student(object):
    class_name = "3班"

    def __init__(self, name,age):
        self.name = name
        self.age = age

    def desc(self):
        pass

    def __setattr__(self, key, value):
        if key == "info":
            self.name,self.age = value
        else:
            self.__dict__[key] =value

    def __getattr__(self, item):
        """
        __getattr__方法的自动执行,需要满足两个条件:一是访问对象属性;二是触发AttributeError异常
        :param item:
        :return:
        """
        if item == "info":
            return "学生姓名是:" + self.name + "学生年龄是:" + str(self.age)
        print("jack")


    def __getattribute__(self, item):
        """
        获取属性值时,首先调用当前方法,方法不存在时调用__getattr__()
        :param item:
        :return:
        """
        if item == "info":
            return "学生姓名是:" + self.name + "学生年龄是:" + str(self.age)
        else:
            return object.__getattribute__(self, item)

st1 = Student("张三", 25)
st1.info = ("李四",58)
print(st1.info)  # 输出结果:学生姓名是李四学生年龄是58
print(st1.name)  # 输出结果:李四
# 访问不存在的属性,首先调用__getattribute__方法(如果该方法未定义,会调用基类的__getattribute__方法),触发AttributeError异常并自动捕获,然后才调用__getattr__方法。
st1.mm   # 输出结果:jack

猜你喜欢

转载自blog.csdn.net/qq_43534980/article/details/113435448
今日推荐