27反射、类的内置方法

一、反射

1、什么是反射?

  用字符串类型的名字去操作变量

2、反射对象中的属性和方法

  getattr\hasattr\setattr\delettr

3、  getattr:通过字符串类型的名字取到变量的值

  hasattr:判断字符串类型的名字对应的值是否存在

  setattr :(建立)设置字符串类型的名字和值

  deleattr:删除字符串类型的变量

getattr:

class A:
    def func(self):
        print('in func')

a = A()
a.name = 'alex'
a.age = 63
# 反射对象的属性
ret = getattr(a,'name')  # 通过变量名的字符串形式取到的值
print(ret)

hasattr(与getattr配合使用)

class A:
    price=20
    @classmethod
    def func(self):
        print('in the func')
if hasattr(A,'func'):                  #hasattr判断是否变量存在
    ret=getattr(A,'func')
    ret()

反射模块中的属性和方法:

  可以反射模块(包括内置模块)的属性和方法,可以反射自己模块(其他模块)的函数和变量,还可以反射一个模块的类。

#模块
import my
#反射模块的属性
print(my.day)
print(getattr(my,'day'))

#反射模块的方法
getattr(my,'wahaha')()

#内置模块也能用
time
asctime
import time
print(getattr(time,'time')())
print(getattr(time,'asctime')())

def qqxing():
    print('qqxing')
year = 2018
import sys
print(sys.modules['__main__'].year)
# 反射自己模块中的变量
print(getattr(sys.modules['__main__'],'year'))

# 反射自己模块中的函数
getattr(sys.modules['__main__'],'qqxing')()
变量名 = input('>>>')
print(getattr(sys.modules[__name__],变量名))

#要反射的函数有参数怎么办?
print(time.strftime('%Y-%m-%d %H:%M:S'))
print(getattr(time,'strftime')('%Y-%m-%d %H:%M:S'))

#一个模块中的类能不能反射得到?
import my
print(getattr(my,'C')())
if hasattr(my,'name'):
    getattr(my,'name')

setattr:设置修改值

  

class A:
    def func(self):
        pass
a=A()
setattr(a,'name','alex')
print(getattr(a,'name'))

delattr:删除一个变量

# delattr 删除一个变量
delattr(a,'name')
print(a.name)
delattr(A,'name')
print(a.name)

 二、类的内置方法

  __str__ 、__repr__、__del__、__len__、__call__

__str__:自己没有__str__方法的时候,就去父类object去调用,返回调用这个方法的对象的内存地址,如果自己定义了__str__方法,那么就执行自己的__str__方法,打印这个对                   象的时候,就会执行a.__str__方法(默认就执行了),(返回一些自己定义的方法)。

class A:
    def __str__(self):
        return "A's object"
a=A()
print(a)

__repr__:类似__str__方法,就是调用repr执行的内置方法,%r,print(repr)也是执行的它(不知道它有什么用)

__del__:析构函数,删除一个对象之前进行一些收尾工作

__call__:执行函数的时候自动执行打印一些属性

posted @ 2018-01-28 22:17  王二黑  阅读(203)  评论(0编辑  收藏  举报