一、反射

   通过字符串的形式操作对象相关的属性。(使用字符串数据类型的变量名来获取这个变量的值)

    Python中的一切事物都是对象(都可以使用反射)

      反射类中的变量

      反射对象中的变量

      反射模板中的变量

      反射本文件中的变量

    用反射的场景:

      input

      网络

      文件

#hasattr

def hasattr(*args, **kwargs): # real signature unknown
"""
Return whether the object has an attribute with the given name. This is done by calling getattr(obj, name) and catching AttributeError.
"""
pass #getattr def getattr(object, name, default=None): # known special case of getattr
"""
getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
When a default argument is given, it is returned when the attribute doesn't
exist; without it, an exception is raised in that case.
"""
pass #setattr def setattr(x, y, v): # real signature unknown; restored from __doc__
"""
Sets the named attribute on the given object to the specified value. setattr(x, 'y', v) is equivalent to ``x.y = v''
"""
pass #delattr def delattr(x, y): # real signature unknown; restored from __doc__
"""
Deletes the named attribute from the given object. delattr(x, 'y') is equivalent to ``del x.y''
"""
pass

反射的4种方法源码

  

  1、getattr()

    getattr(变量名:命名空间,字符串:属于一个命名空间内的变量名)

      类名.静态属性  getattr(类名,‘静态属性’)

      类名.类方法()   getattr(类名,‘类方法’)()

      类名.静态方法()  getattr(类名,‘静态方法’)()

      

      对象.对象属性  getattr(对象,‘对象属性’)

      对象.方法()    getattr(对象,‘方法’)()

      模块名.方法名

      模块名.类名

      模块名.变量

      模块名.函数

      本文件反射  import sys

      getattr(sys.modules[__name__],'所有定义在这个文件中的名字')

# 反射类中的变量: 静态属性、类方法、静态方法
class Foo:
school = 'oldboy'
country = 'china'
language = 'chiness' @classmethod     # 类方法
def class_method(cls):
print(cls.school) @staticmethod    # 静态方法
def static_method():
print('in staticmethod') def wahaha(self):  # 普通方法
print('wahaha') print(Foo.school) # oldboy
print(Foo.country) # china
print(Foo.language) # chiness # 判断实现
inp = input('>>>')
if inp == 'school': print(Foo.school) # oldboy
elif inp == 'country': print(Foo.country) # china
elif inp == 'language': print(Foo.language) # chiness # 反射实现
while 1:
inp = input('>>>') # 输school,打印oldboy 输country,打印china 输language,打印chiness
print(getattr(Foo,inp)) # 解析getattr方法
print(getattr(Foo,'school')) # oldboy
Foo.class_method() # oldboy
print(getattr(Foo,'class_method')) # <bound method Foo.class_method of <class '__main__.Foo'>>
getattr(Foo,'class_method')() # oldboy 相当于:Foo.class_method()
getattr(Foo,'static_method')() # in staticmethod 相当与:Foo.static_method()

   

# 反射对象中的变量

class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def eating(self):
print('%s is eating' % self.name)
alex = Foo('alex',38)
print(getattr(alex,'name')) # alex  反射对象属性
print(getattr(alex,'age')) # 38  
getattr(alex,'eating')() # alex is eating  反射对象方法
# 反射模块中的变量
import os # os就是一个模块
os.rename('D:\\python_task1.py','D:\\python_task2.py')
getattr(os,'rename') # 把python_task1.py改成了python_task2.py
getattr(os,'D:\\python_task1.py','D:\\python_task2.py') # 效果同上
# 反射本文件中的变量

a = 1
b = 2
name = 'alex' def qqxing():
print('like eat qqxing') class Foo:
pass import sys print(sys.modules['__main__']) # 本文件的命名空间
print(sys.modules['__main__'].a) #
print([__name__]) # ['__main__'] print(sys.modules[__name__]) # 反射本文件中的变量 固定的使用这个命名空间
print(getattr(sys.modules[__name__],'a')) #
print(getattr(sys.modules[__name__],'b')) #
print(getattr(sys.modules[__name__],'name')) # alex
getattr(sys.modules[__name__],'qqxing')() # like eat qqxing
print(getattr(sys.modules[__name__],'Foo')) # <class '__main__.Foo'> Foo类的地址
print(getattr(sys.modules[__name__],'Foo')()) # <__main__.Foo object at 0x0072BED0> Foo类对象的地址

  2、hasattr()

    hasattr(变量名:命名空间,字符串:属于一个命名空间内的变量名)  成立返回Ture,不成立返回False,一般与getattr搭配使用

class Foo:
school = 'oldboy'
country = 'china'
language = 'chiness' @classmethod
def class_method(cls):
print(cls.school) @staticmethod
def static_method():
print('in staticmethod') def wahaha(self):
print('wahaha') inp = input('>>>') # 输入 haha
print(getattr(Foo, inp))
# 如果输入的不存在则报错
# AttributeError: type object 'Foo' has no attribute 'haha'
# 所以要给他定义一个判断条件 inp = input('>>>')
if hasattr(Foo,inp): # 如果输入的字符串在这个类中,则成立
print(getattr(Foo,inp))

  3、setattr()

    setattr(名称空间,变量名,变量值)  更改变量的值

      给命名空间的某一个名字设置一个值

# setattr:接受三个参数 命名空间 ‘变量名’ 变量值
class Foo:
school = 'oldboy' def func():
print('wahaha') Foo.school = 'OLDBOY' # 直接更改
print(Foo.school) # OLDBOY
setattr(Foo,'school','OLDOBY') # 有school这个属性则更改
print(Foo.school) # OLDBOY
print(getattr(Foo,'school'))
setattr(Foo,'name','alex') # 没有name这个属性则添加
print(Foo.name) # alex
print(Foo.__dict__) setattr(Foo,'func',func) # 往类中添加方法,不过一般没人这么做
Foo.func() #wahaha
func() #wahaha
print(Foo.__dict__)
'''
{'__module__': '__main__', 'Country': 'China', '__dict__': <attribute '__dict__' of 'Foo' objects>,
'__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__doc__': None, 'func': <function func at 0x00788D68>}
'''

  4、delattr()

    delattr(命名空间,变量)

      删除某一个命名空间中变量对应的值

class Foo:
school = 'oldboy'
country = 'china'
language = 'chiness' def wahaha(self):
print('wahaha') def qqxing(self):
print('qqxing') del Foo.country # 直接删除一个属性
print(Foo.__dict__)
delattr(Foo,'school') # 使用delattr删除一个属性
print(Foo.__dict__)
del Foo.wahaha # 直接删除一个方法
print(Foo.__dict__)
delattr(Foo,'qqxing') # 使用delattr删除一个方法
print(Foo.__dict__)

二、内置方法

    在不是需要程序员定义,本身就存在在类中的方法就是内置方法

    内置的方法通常都长这样:__名字__

    各种不同叫法:名字+(双下方法、魔术方法、内置方法)

    所有的双下方法,都不需要我们直接去调用,都有另外一种自动触发它的语法

   __init__:

    不需要我们主动调用,而是在实例化的时候内部自动调用的

   __str__ 和 __repr__:  

    这俩方法的返回值必须是字符串,否则抛出异常。  

   __str__:
    当你打印一个对象的时候 触发__str__
    当你使用%s格式化的时候 触发__str__
    str强转数据类型的时候 触发__str__    __repr__:
    repr是str的备胎
    有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__
    repr(obj)内置函数对应的结果是 __repr__的返回值
    当你使用%r格式化的时候 触发__repr__
class Course:

    def __init__(self,name,period,price,teacher):
self.name = name
self.period = period
self.price = price
self.teacher = teacher def __repr__(self):
return 'repr : %s %s %s %s ' % (self.name,self.period,self.price,self.teacher) def __str__(self):
return 'str : %s %s %s %s ' % (self.name, self.period, self.price, self.teacher) course_lst = []
python = Course('python','6 month',29800,'alex')
course_lst.append(python)
linux = Course('linux','5 month',19800,'oldboy')
course_lst.append(linux)
for id,course in enumerate(course_lst,1):
print(id,course) # 1 str : python 6 month 29800 alex
# 2 str : linux 5 month 19800 oldboy print('%s %s' % (id,course)) # 效果同上 print(str(course)) # str : python 6 month 29800 alex
# str : linux 5 month 19800 oldboy print(repr(course)) # repr : python 6 month 29800 alex
# repr : linux 5 month 19800 oldboy print('%r' % course) # 效果同上 # __str__
# 当你打印一个对象的时候 触发__str__
# 当你使用%s格式化的时候 触发__str__
# str强转数据类型的时候 触发__str__ # __repr__
# repr是str的备胎
# 有__str__的时候执行__str__,没有实现__str__的时候,执行__repr__
# repr(obj)内置函数对应的结果是 __repr__的返回值
# 当你使用%r格式化的时候 触发__repr__

    

#子类与父类的__str__和__repr__触发顺序:

class Foo:
def __str__(self):
return 'Foo.str'
def __repr__(self):
return 'Foo.repr' class Son(Foo):
def __str__(self):
return 'Son.str'
def __repr__(self):
return 'Son.str' obj = Son()
print(obj)
'''
当打印子类的对象时:
1、先从子类找__str__
2、子类中没有__str__,则到父类找__str__
3、子类和父类都没有__str__,则找子类的__repr__
4、子类和父类都没有__str__,且子类没有__repr__,则找父类的__repr__
'''

    

    

《Python》反射、内置方法(__str__,__repr__)的更多相关文章

  1. 内置方法 __str__ __repr__

    内置方法(双下方法,魔术方法) 在不需要程序员定义,本身就存在的类中的方法就是内置方法 内置方法:  __名字__ __init__   不需要我们主动调用,而是在实例化的时候内部自动调用的,存在一种 ...

  2. 第8.14节 Python类中内置方法__str__详解

    一. object类内置方法__str__和函数str 类的内置方法__str__和内置函数str实际上实现的是同一功能,实际上str调用的就是__str__方法,只是调用方式不同,二者的调用语法如下 ...

  3. python 字典内置方法get应用

    python字典内置方法get应用,如果我们需要获取字典值的话,我们有两种方法,一个是通过dict['key'],另外一个就是dict.get()方法. 今天给大家分享的就是字典的get()方法. 这 ...

  4. Python的内置方法,abs,all,any,basestring,bin,bool,bytearray,callable,chr,cmp,complex,divmod

    Python的内置方法 abs(X):返回一个数的绝对值,X可以是一个整数,长整型,或者浮点数,如果X是一个复数,此方法返回此复数的绝对值(此复数与它的共轭复数的乘积的平方根) >>> ...

  5. 多态 鸭子类型 反射 内置方法(__str__,__del__) 异常处理

    ''' 1什么是多态 多态指的是同一种/类事物的不同形态 2 为何要有多态 多态性:在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象 多态性的精髓:统一 多态性的好处: 1增加了程序的 ...

  6. python基础之反射内置方法元类

    补充内置函数 isinstance(obj,Foo)   # 判断obj是不是foo的实例 issubclass()      # 判断一个类是不是另一个类的子类 反射 什么是反射? 通过字符串来操作 ...

  7. 6.python字符串-内置方法列举

    所谓内置方法,就是凡是字符串都能用的方法,这个方法在创建字符串的类中,下面是总结: 首先,我们要学习一个获取帮助的内置函数 help(对象) ,对象可以是一个我们创建出来的,也可以是创建对象的那个类, ...

  8. python字符串内置方法

    网上已经有很多,自己操作一遍,加深印象. dir dir会返回一个内置方法与属性列表,用字符串'a,b,cdefg'测试一下 dir('a,b,cdefg') 得到一个列表 ['__add__', ' ...

  9. Python的内置方法

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  10. python黑魔法 -- 内置方法使用

    很多pythonic的代码都会用到内置方法,根据自己的经验,罗列一下自己知道的内置方法. __getitem__ __setitem__ __delitem__ 这三个方法是字典类的内置方法,分别对应 ...

随机推荐

  1. BIOS、MBR、UEFI和GPT关系

    很多用户在新买电脑,或是给已有电脑重装系统时都出现过怎么都无法引导U盘安装的情况.究其原因,还是没能搞清楚BIOS.MBR.UEFI和GPT的复杂关系.所以,今天小编就和大家分享一下它们之间的爱恨情仇 ...

  2. linux下如何查看当前机器提供了哪些服务

    答:使用netstat工具 在命令行下输入netstat -atun即可列出当前机器提供的服务 netstat各选项解析: -a 列出所有服务 -t 列出tcp相关 -u 列出udp相关 -n 以数字 ...

  3. win10 字体渲染优化 色彩调整

    最近烧包买了个2k显示器,发现跟win10使用,一堆问题,最大的就是字体,其实应该买4k,那样正好设置200%字体,现在设置的124% 字体: 以前使用的是mactype这个软件 https://pa ...

  4. hdu 1370 || poj 1006 简单的中国剩余定理或者暴力

    Biorhythms Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Probl ...

  5. python 生成元组

    #create a tuple l = [(,), (,), (,)] print(list(zip(*l)))

  6. ubuntu 14.04 server 能ping通,但不能ssh

    ssh是一种安全协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全,我们可以很方便的用ssh链接工具连接远程服务器进行相关操作,但是在享受这种方便的同时我们需要进行一些配置. 首先我们需要在 ...

  7. 直接通过OptionalAttribute, DefaultParameterValueAttribute定义缺省参数

  8. webdriver 的三种等待方式

    1.显式等待  一个显式等待是你定义的一段代码,用于等待某个条件发生然后再继续执行后续代码. from selenium import webdriverfrom selenium.webdriver ...

  9. 《F4+2—团队项目设计完善&编码测试》

    1:根据OOD详细设计工作要点,修改完善团队项目系统设计说明书和详细设计说明       a.软件系统设计说明书的完善 将测试启动准则,测试结束准则,测试暂停/中止标准加到了测试计划中.将把在测试中会 ...

  10. 用Java随机生成四则运算

    代码链接:https://github.com/devilwjy/Code.Demo 需求分析: 1.程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符 ...