Func Func 语法 作用 retype hasattr hasattr(object, name) 判断 对象中是否含有 该属性。 True / False setattr setattr(object, name, values) 给对象的属性 赋值,若属性不存在,先创建再赋值。 None getattr getattr(object, name[,default]) 获取 属性数值。 属性存在时,返回 属性数值;否则根据 默认输出值 返回 或 报 AttributeError。 delat
这里下面用网上比较热的代码进行测试和注释,因本人接触Python不足两星期,若有纰漏,请君不吝赐教;
__get__,__getattr__和__getattribute都是访问属性的方法,但不太相同。 object.__getattr__(self, name) 当一般位置找不到attribute的时候,会调用getattr,返回一个值或AttributeError异常。 object.__getattribute__(self, name) 无条件被调用,通过实例访问属性。如果class中定义了__getattr__(),则__getattr__()不会被调用(除非显示调用或引发AttributeError异常) object.__get__(self, instance, owner) 如果class定义了它,则这个class就可以称为descriptor。owner是所有者的类,instance是访问descriptor的实例,如果不是通过实例访问,而是通过类访问的话,instance则为None。(descriptor的实例自己访问自己是不会触发__get__,而会触发__call__,只有descriptor作为其它类的属性才有意义。)(所以下文的d是作为C2的一个属性被调用)
当实例对象调用一个不存在的属性时,系统通常会报错,那有啥办法避免这种现象么,或者说自定义报错信息,答案是肯定的,我们可以通过定义__getattr__(self,name)魔法方法来实现。
Python中的魔术方法__call__和__getattr__方法是用于实现对象可调用和属性访问的重要方法。
#map()的功能是将函数对象依次作用于表的每一个元素,每次作用的结果储存于返回的表re中。 #map通过读入的函数(这里是lambda函数)来操作数据 def test_func_map(): re = map((lambda x: x+3), [1, 2, 3, 4]) print re def testA(a, b, **kargs): print a+b print "testA: %s" % kargs #函数作为参数传递 def test_func(func, a, b, **kargs): func(a, b) print "test_func: %s" % kargs #函数作为参数传递 def test_func_lambda(func, **kargs): func() print "test_func_lambda: %s" % kargs def test_func_getattr(): func = getattr(obj, "testA") func(1, 2) class TestGetattr(): aa = "2a" def get_attr(self): print "test getattr()" def print_text(self): print "print text" def print_string(self): print "print string" #getattr(obj, "a")的作用和obj.a是一致的,但该方法还有其他的用处,最方便的就是用来实现工厂方法 #根据传入参数不同,调用不同的函数实现几种格式的输出 def output(print_type="text"): tg = TestGetattr() output_func = getattr(tg, "print_%s" % print_type) output_func() if __name__ == "__main__": #test_func(testA, 1, 2, aa="aa") #test_func_lambda((lambda: testA(1, 2, bb="bb")), cc="cc") #test_func_map() #test_func_getattr() #getattr方法,传入参数是对象和该对象的函数或者属性的名字,返回对象的函数或者属性实例 obj = TestGetattr() func = getattr(obj, "get_attr") #getattr()获得对象的属性和方法 func() print getattr(obj, "aa") #完成对象的反射 print obj.aa #callable方法,如果传入的参数是可以调用的函数,则返回true,否则返回false。 print callable(getattr(obj, "aa")) output("string")
python的提供一系列和属性访问有关的特殊方法:__get__, __getattr__, __getattribute__, __getitem__。本文阐述它们的区别和用法。
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问,检测和修改它本身状态或行为的一种能力(自省),它首先被程序语言的设计领域所采用,并在Lisp和面向对象取得了成绩
object._getattr_(self, name) 拦截点号运算。当对未定义的属性名称和实例进行点号运算时,就会用属性名作为字符串调用这个方法。如果继承树可以找到该属性,则不调用此方法 实例instance通过instance.name访问属性name,只有当属性name没有在实例的__dict__或它构造类的__dict__或基类的__dict__中没有找到,才会调用__getattr__。当属性name可以通过正常机制追溯到时,__getattr__是不会被调用的。如果在__getattr__(s
反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。
笔者看法,字符串相较于函数更容易传递,比如我们可以轻松地通过命令行参数或者常量在不同脚本中传递。
getattr (object, name[, default])是Python的内置函数之一,它的作用是获取对象的属性。
描述getattr() 函数用于返回一个对象属性值。语法getattr 语法:getattr(object, name[, default])参数object -- 对象。name -- 字符串,对象属性。default -- 默认返回值,如果不提供该参数,在没有对应属性时,将触发 AttributeError。返回值返回对象属性值。实例以下实例展示了 getattr 的使用方法:>>>class A(object):... bar = 1...>>> a = A()>>> getattr(a, 'bar'
isinstance(a,b) ----> 判断a这个对象是否是b类型的(可以向上判断, 即考虑继承关系往父类判断)
通过字符串操作对象或者模块的成员(属性、方法),基于字符串驱动的,可以反射的对象包含:
Python的hasattr() getattr() setattr() 函数使用方法详解
一.反射定义 放射是指程序可以访问。检测和修改它本身状态或行为的一种能力(自省)。 二.四个自省的函数 Python中提供了以下四种自省的函数,使用于类和对象。 1.hasattr函数--用于判断obj中有没有name字符串对应的方法或属性,若有返回Ture,若无则返回False。 格式:hasattr(obj,name)
在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询。这些函数提供了一种方便的方式来检查对象是否具有特定属性,获取属性的值,以及设置属性的值。本文将从入门到精通,全面介绍hasattr()、getattr()和setattr()函数的用法和相关知识点。
自省就是面向对象的语言所写的程序在运行时,所能知道对象的类型.简单一句就是运行时能够获得对象的类型.比如type(),dir(),getattr(),hasattr(),isinstance().
类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)
反射的概念是由 Smith 在 1982 年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)
Python一切皆对象,对象都有很多属性和方法,使用时我们怎么知道对象有哪些属性,以及如何获取对象的属性和设置对象的属性呢?
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2017/11/22 20:35 # @Author : mixiu26 def bulk(self): print("%s is yelling..." % self.name) class Dog(object): def __init__(self,name): self.name = name def eat(self,food):
# 反射:用过字符串的形式操作对象成员(python中一切皆为对象,所以也可以操作类,模块) """ 1、getattr(obj, str),去obj对象获取str属性,义字符串的形式取对象中的成员(字段,方法) 2、hasattr(obj, str)检测obj对象中有没有str成员,返回值True或False 3、setattr(obj, key, value),设置obj对象成员,key=value 4、delattr(obj, str)删除obj对象成员 """ # 示例1.操作示例对象 clas
python中的反射功能是由以下四个内置函数提供:hasattr、getattr、setattr、delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员、获取成员、设置成员、删除成员。
1.使用 getattr(object, name, default=None) 获取属性FM5免费资源网
有时候,你可能会发现了解正在与之交互的文件或文件路径的基本文件属性很有用。如果你读取文件内容后再将内容写回文件,那么知道原始文件是否为只读是重要的,在这种情况下,你的写入将失败,或者如果它是系统文件,在这种情况下写入也可能会失败,但是如果成功,可能会损坏系统。有时候,你可能只想检查一个字符串是否确实指向一个有效的文件或目录。
写了一个类,类里面写了几个方法,在调用方法的时候,希望能打印出调用了哪个方法,方便快速定位问题,于是可以用类里面的getattribute属性拦截器。 python的类默认都继承了object类,object提供了了很多原始的内建属性和方法。
请用代码说明hasattr、getattr和setattr的作用 ''' hasattr: 可以判断一个对象是否包含某个属性 getattr: 可以获取对象中某一个属性的值 setattr: 可以设置对象中某一个属性的值 ''' class Person(): def __init__(self): self.name = 'ruochen' self.age = 18 def show(self): print(self.name)
反射就是通过字符串的形式,导入模块,通过字符串的形式,去模块寻找制定函数并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动。
反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去一个对象中寻找成员 根据字符串的形式去一个对象中设置成员 根据字符串的形式去一个对象中删除成员 根据字符串的形式去一个对象中判断成员是否存在 ---- 初始反射 通过字符串的形式,导入模块 根据用户输入的模块名称,导入对应的模块并执行模块中的方法 # Python使用的是3.5.1 [root@root ~]# python -V Python 3.5.1 # commons.py为模块文件 [root@root ~]# ls common
Python 有个魔法函数 __getattr__,可以在调用对象的某个属性时自动执行,利用这一点,我们可以实现非常灵活的功能。
正常情况下,当调用类的方法或属性时,如果不存在,就会报错 要避免这个错误,除了可以加上那个要调用但不存在的属性外,Python还有另一个机制,那就是写一个__getattr__()方法,动态返回一个属性 只有在没有找到属性的情况下,才调用__getattr__,已有的属性会直接在类属性里查找,不会在__getattr__中查找
hasattr(object, name) 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False。 需要注意的是name要用括号括起来 >>> class test(): ... name="xiaohua" ... def run(self): ... return "HelloWord" ... >>> t=test() >>> hasattr(t, "name") #判断对象有name属性 True
运行时,区别于翻译时,指的是程序被加载到内存中执行的时候。 反射,reflection,指的是运行时获取类型定义信息。 一个对象能够在运行时,像照镜子一样,反射出其类型信息。简单说,在Python中,能够通过一个对象,找出其type、class、attribute或method的能力,称为反射或自省。 具有反射能力的函数有type(),isinstance(),callable().dir().getattr()等
图中输入choice的内容是一个字符串,正常调用d.eat()这可不是一个字符串。 报错提示Dog中不存在attribute choice(字符串)
python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射) 一、getattr 对象获取 class Manager: role = "管理员" def __init__(self,name,sex,phone,mail): self.name = name self.sex = sex self.phone = phone self.mail = mail d
class Person(object): """定义一个人类""" def __init__(self, name): self.name = name def eat(self, food): print("%s is eating %s" % (self.name, food)) def talk(self): print("%s is yelling..." % self.name) p = Person("hexingco
在Python中,反射是一种动态访问和修改对象属性和方法的机制。通过反射,我们可以在运行时获取对象的属性和方法,以及修改它们的值。反射可以帮助我们编写更灵活、更通用、更易维护的代码,例如实现通用的配置文件解析、ORM框架、远程调用等。
解释Python的反射,先提一个简单的需求,现在我有一个简易的网站,由两个文件组成,一个是具体执行操作的commons.py文件,一个是入口文件index.py,现在我需要在入口文件中设置,让用户输入url,根据用户输入的url去后端执行相应的操作,内容如下:
有如下文件: index.py #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = 'ryan' """ import home print 'oldboy....' url=raw_input('url:') if url == 'home/dev': ret = home.dev() print ret if url =='/home/index': ret = home.index() print ret
LazySetting顾名思义,就是延迟获取配置内容。比如,我们定义了一个对象A,并对其添加了一些属性,对A初始化时,我们将A的属性的值设置为空,当我们要访问A其中的一个属性时,此时属性的值为空,我们才加载属性的值,并将空值设置为对应的值,返回属性值,下次获取属性值时,属性值不为空,直接返回属性值。
如果你对 Python 的魔法方法有所了解,就能发现这里的奇怪之处:popen的对象有__next__()方法,但却不能被next()调用,也就不是个迭代器。还有这种事吗?于是我们来看源码,看看popen()到底返回了个什么对象(省略了无关代码):
我们要导入另外一个模块,可以使用import.现在有这样的需求,我动态输入一个模块名,可以随时访问到导入模块中的方法或者变量,怎么做呢?
isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上
#!/usr/bin/env python3 # -*- coding: utf-8 -*-
- 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。
多重继承 class Animal(object): pass class Mammal(Animal): pass class Bird(Animal): pass class Dog(Mammal): pass class Bat(Mammal): pass class Parrot(Bird): pass class Ostrich(Bird): pass class Runnable(object): def run(se
包装和授权往往使用在定制某种类,其实现的多样性,只要你能想的到,就可以出现千变万化的授权、包装实现方式,上述仅仅提供参考。
定制类 反射 反射又称为自省,指的是程序可以访问、检测和修改它本身状态和行为的一种能力。python中提供了以下四个自检功能的函数。 hasattr(object, name):用来检测object(适用于类、文件、模块或对象,一切皆对象)中有没有一个name字符串对应的方法或属性。
领取专属 10元无门槛券
手把手带您无忧上云