嗨客网搜索

Python类getattr

Python类__getattr__函数教程

每一个 Python 中的 实例对象 中,都有一个内置的 __getattr__ 函数,当我们访问一个不存在的 实例属性 时,就会自动调用到 __getattr__ 函数

如果,我们使用类名访问一个不存在的 类属性,那么是不会调用 __getattr__ 函数的,并且,如果访问一个存在的类属性或者实例属性也不会调用到 __getattr__ 函数。

Python类__getattr__函数详解

语法

def __getattr__(self, item): pass

说明

当我们访问一个不存在的实例属性时,会自动调用 __getattr__ 函数,其中 item 参数是我们访问的属性。

案例

访问不存在的类属性

访问不存在的类属性,不会自动调用 __getattr__ 方法

print("嗨客网(www.haicoder.net)") class Student: course = "Python" print("Student course =", Student.course)

程序运行后,控制台输出如下:

44_python类getattr函数.png

我们创建了一个类 Student,并且为该类添加了一个类属性 course,接着,使用类名访问类属性,正确输出了类属性的值。此时我们将程序修改如下:

print("嗨客网(www.haicoder.net)") class Student: course = "Python" def __getattr__(self, item): print("Get not exist attr, key =", item) print("Student course =", Student.course) print("Student score =", Student.score)

程序运行后,控制台输出如下:

45_python类getattr函数.png

为 Student 类添加了一个 __getattr__ 函数,此时我们使用类名访问了一个不存在的类属性,程序仍然报错,说明没有调用到 __getattr__ 函数。

访问不存在的实例属性

访问不存在的实例属性,会自动调用 __getattr__ 方法

print("嗨客网(www.haicoder.net)") class Student: course = "Python" def __init__(self, name, age): self.name = name self.age = age stu = Student("William", 18) print("stu name =", stu.name, "age =", stu.age)

程序运行后,控制台输出如下:

46_python类getattr函数.png

我们创建了一个类 Student,并且为该类添加了一个类属性 course 和两个实例属性 name 和 age,接着,使用实例访问实例属性,正确输出了实例属性的值。此时我们将程序修改如下:

print("嗨客网(www.haicoder.net)") class Student: course = "Python" def __init__(self, name, age): self.name = name self.age = age stu = Student("William", 18) print("stu name =", stu.name, "age =", stu.age) print("stu sex =", stu.sex)

程序运行后,控制台输出如下:

47_python类getattr函数.png

我们访问了一个不存在的实例属性,此时程序报错,再次将程序修改如下:

print("嗨客网(www.haicoder.net)") class Student: course = "Python" def __init__(self, name, age): self.name = name self.age = age def __getattr__(self, item): print("Get not exist attr, key =", item) return "default" stu = Student("William", 18) print("stu name =", stu.name, "age =", stu.age) print("stu sex =", stu.sex)

程序运行后,控制台输出如下:

48_python类getattr函数.png

为 Student 类添加了一个 __getattr__ 函数,此时我们使用实例再次访问了一个不存在的实例属性,程序不报错,而是调用到 __getattr__ 函数。

输出了 __getattr__ 函数里面的内容,并且访问的不存在的属性的值,被 __getattr__ 函数的返回值替代了。

Python类__getattr__函数总结

每一个 Python 中的实例对象中,都有一个内置的 __getattr__ 函数,当我们访问一个不存在的实例属性时,就会自动调用到 __getattr__ 函数。

如果,我们使用类名访问一个不存在的类属性,那么是会调用 __getattr__ 函数的,并且,如果访问一个存在的类属性或者实例属性也不会调用到 __getattr__ 函数。Python 类__getattr__函数语法:

def __getattr__(self, item): pass
嗨客网顶部