机票网站建设方式,网站开发技术的现状,知识库wordpress,网站建设计划书1200字引言#xff1a;在阅读高手写的代码时#xff0c;有很多简写的形式#xff0c;如果没有见过还真的看不太懂是什么意思#xff0c;其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法#xff0c;相关联的hasattr()、getattr()、setattr()函数的使用也一并学习…引言在阅读高手写的代码时有很多简写的形式如果没有见过还真的看不太懂是什么意思其中一个比较常用的就是getattr()用来调用一个类中的变量或者方法相关联的hasattr()、getattr()、setattr()函数的使用也一并学习了一下正文1. hasattr(object, name)判断object对象中是否存在name属性当然对于python的对象而言属性包含变量和方法有则返回True没有则返回False需要注意的是name参数是string类型所以不管是要判断变量还是方法其名称都以字符串形式传参getattr和setattr也同样 class A():name pythondef func(self):return A()类的方法func() hasattr(A, name)True hasattr(A, age)False hasattr(A, func)True2. getattr(object, name[, default])获取object对象的属性的值如果存在则返回属性值如果不存在分为两种情况一种是没有default参数时会直接报错给定了default参数若对象本身没有name属性则会返回给定的default值如果给定的属性name是对象的方法则返回的是函数对象需要调用函数对象来获得函数的返回值调用的话就是函数对象后面加括号如func之于func();另外还需要注意如果给定的方法func()是实例函数则不能写getattr(A, func)()因为fun()是实例函数的话是不能用A类对象来调用的应该写成getattr(A(), func)()实例函数和类函数的区别可以简单的理解一下实例函数定义时直接def func(self):这样定义的函数只能是将类实例化后用类的实例化对象来调用而类函数定义时需要用classmethod来装饰函数默认的参数一般是cls类函数可以通过类对象来直接调用而不需要对类进行实例化 class A():name pythondef func(self):return Hello world getattr(A, name)python getattr(A, age) # age变量不存在则报错Traceback (most recent call last):File , line 1, in getattr(A, age)AttributeError: class A has no attribute age getattr(A, age, 20)20 getattr(A, func) getattr(A, func)() # func()函数不能被A类对象调用所以报错Traceback (most recent call last):File , line 1, in getattr(A, func)()TypeError: unbound method func() must be called with A instance as first argument (got nothing instead) getattr(A(), func)()Hello world class A(object):name pythonclassmethoddef func(cls):return the method of A object. getattr(A, func)()the method of A object.3. setattr(object, name, value)给object对象的name属性赋值value如果对象原本存在给定的属性name则setattr会更改属性的值为给定的value如果对象原本不存在属性namesetattr会在对象中创建属性并赋值为给定的value class A():name pythondef func(self):return Hello world setattr(A, name, java) getattr(A, name)java setattr(A, age, 20) getattr(A, age)20一般先判断对象中是否存在某属性如果存在则返回如果不存在则给对象增加属性并赋值很简单的if-else判断 class A():name pythondef func(self):return Hello world if hasattr(A, age):print getattr(A, age)else:setattr(A, age, 20) getattr(A, age)20高级使用# -*- coding:utf-8 -*-import sysimport platformclass InfoCollection(object):def collect(self):# 收集平台信息# 首先判断当前平台根据平台的不同执行不同的方法try:func getattr(self, platform.system().lower())info_data func()formatted_data self.build_report_data(info_data)return formatted_dataexcept AttributeError:sys.exit(不支持当前操作系统 [%s]! % platform.system())staticmethoddef linux():from plugins.collect_linux_info import collectreturn collect()staticmethoddef windows():from plugins.collect_windows_info import Win32Inforeturn Win32Info().collect()staticmethoddef build_report_data(data):# 留下一个接口方便以后增加功能或者过滤数据passreturn data