Python面向对象之反射

什么是反射?#是什么

答:用字符串数据类型的变量名来访问这个变量的值

反射的方法:getattr hasattr setattr delattr

好处:优化代码

1.getattr

用法:getattr(object, name[,default]) -> value

返回object中name字符串对应的方法和属性,不存在返回默认值default。

如果没有传default,那么找不到就会报错

#用在哪,怎么用?

#类 静态属性,静态方法,类方法

class A:

ATTR = '静态属性'

@classmethod

def func0(cls):

print('类方法')

@staticmethod

def func1():

print('静态方法')

#反射查看属性

print(getattr(A, 'ATTR'))

#反射调用类方法

getattr(A, 'func0')()

#反射调用静态方法

getattr(A, 'func1')()

#对象 对象属性,对象方法

class B:

def __init__(self, name):

self.name = name

def func0(self):

print('普通方法')

b = B('Jake')

#反射查看对象属性

print(getattr(b, 'name'))

#反射查看对象方法

getattr(b, 'func0')()

#模块

import os

print(os.sep)

print(getattr(os, 'sep'))

#反射自己模块中的内容,需要先找到自己当前文件所在的命名空间

import sys

def func0():

print('my_func0')

my_namespace = sys.modules['__main__']

my_namespace.func0()

getattr(my_namespace, 'func0')()

2.hasattr

用法:hasattr(object, name) #判断object中有没有一个name字符串对应的方法和属性

#如果存在返回True,不存在返回False,一般与getattr配合使用

class A:

ATTR = '静态属性'

print(hasattr(A, 'ATTR'))#Trule

print(hasattr(A, 's'))#False

3.setattr

用法:setattr(object, name, value)

修改object中name字符串对应的属性name变为value

class A:

ATTR = '静态属性'

@staticmethod

def func1():

print('静态方法')

setattr(A, 'ATTR', '静态属性大哥')

print(A.ATTR)

4.delattr

用法:delattr(object, name)

删除object中name字符串对应的属性和方法

class A:

ATTR = '静态属性'

@staticmethod

def func1():

print('静态方法')

print(A.__dict__)

delattr(A, 'ATTR')

delattr(A, 'func1')

print(A.__dict__)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180810A0Z7SA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券