赞
赏
__getattr__
函数教程每一个 Python 中的 实例对象 中,都有一个内置的 __getattr__
函数,当我们访问一个不存在的 实例属性 时,就会自动调用到 __getattr__
函数。
如果,我们使用类名访问一个不存在的 类属性,那么是不会调用 __getattr__
函数的,并且,如果访问一个存在的类属性或者实例属性也不会调用到 __getattr__
函数。
__getattr__
函数详解def __getattr__(self, item):
pass
当我们访问一个不存在的实例属性时,会自动调用 __getattr__
函数,其中 item 参数是我们访问的属性。
访问不存在的类属性,不会自动调用 __getattr__
方法
print("嗨客网(www.haicoder.net)")
class Student:
course = "Python"
print("Student course =", Student.course)
程序运行后,控制台输出如下:
我们创建了一个类 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)
程序运行后,控制台输出如下:
为 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)
程序运行后,控制台输出如下:
我们创建了一个类 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)
程序运行后,控制台输出如下:
我们访问了一个不存在的实例属性,此时程序报错,再次将程序修改如下:
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)
程序运行后,控制台输出如下:
为 Student 类添加了一个 __getattr__
函数,此时我们使用实例再次访问了一个不存在的实例属性,程序不报错,而是调用到 __getattr__
函数。
输出了 __getattr__
函数里面的内容,并且访问的不存在的属性的值,被 __getattr__
函数的返回值替代了。
__getattr__
函数总结每一个 Python 中的实例对象中,都有一个内置的 __getattr__
函数,当我们访问一个不存在的实例属性时,就会自动调用到 __getattr__
函数。
如果,我们使用类名访问一个不存在的类属性,那么是会调用 __getattr__
函数的,并且,如果访问一个存在的类属性或者实例属性也不会调用到 __getattr__
函数。Python 类__getattr__
函数语法:
def __getattr__(self, item):
pass