python 的类中使用点的方式获取属性,使用[] 获取映射的值的原因

Source
  • 在python 的数据结构中使用. 方式获取属性值,其实是底层实现了__getattribute__ 魔法方法。
  • 例如代码如下:
class Person(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age
	def __getattribute__(self, item):
        return "{} good luck".format(item)
if __name__ == '__main__':
    p=Person("tom",18)
    p.age # 获取属性的同时就会触发 __getattribute__ 方法

终端打印结果
在这里插入图片描述

  • 还有就是字典的取值方式 经过 [] 来取值,其实他是实现了__getitem__ 魔法方法
  • 你可以自定义一个类,重写__getitem__ 这个方法来实现 属性也可以这么取值。
  • 代码如下
class Person(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age
    def __missing__(self, key):
        raise AttributeError(key)


    # def __getitem__(self, key):
    #     try:
    #         return eval("self.{}".format(key)) # 不推荐这么写,eval 注入
    #     except AttributeError:
    #         return  self.__missing__(key)
    def __getitem__(self, key):
        try:
            return self.__getattribute__(key)
        except AttributeError:
            return  self.__missing__(key)

if __name__ == '__main__':
    p=Person("tom",18)
    print(p["name"])
    print(p["age"])
    print(p.age)
  • 终端打印结果
    在这里插入图片描述