python反射实例化_python面向对象 反射原理解析

本文介绍了Python中的静态方法和类方法,分析了它们的区别和使用场景。接着,详细讲解了反射的概念,包括如何通过字符串访问对象属性和方法,以及setattr、getattr、delattr的用法,并提供了对象、类以及模块应用反射的实例。
摘要由CSDN通过智能技术生成

3a2c5c47719654b2eb3ed26ac95e70d8.png

一、静态方法(staticmethod)和类方法(classmethod)

类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属×××互(也就是可以使用类属性)

静态方法:让类里的方法直接被类调用,就像正常调用函数一样

类方法和静态方法的相同点:都可以直接被类调用,不需要实例化

类方法和静态方法的不同点:

类方法必须有一个cls参数表示这个类,可以使用类属性

静态方法不需要参数

绑定方法:分为普通方法和类方法

普通方法:默认有一个self对象传进来,并且只能被对象调用-------绑定到对象

类方法:默认有一个cls对象传进来,并且可以被类和对象(不推荐)调用-----绑定到类

非绑定方法:静态方法:没有设置默认参数,并且可以被类和对象(不推荐)调用-----非绑定

import time

class Date:

def __init__(self,year,month,day):

self.year=year

self.month=month

self.day=day

# @staticmethod

# def now():

# t=time.localtime()

# return Date(t.tm_year,t.tm_mon,t.tm_mday)

@classmethod #改成类方法

def now(cls):

t=time.localtime()

return cls(t.tm_year,t.tm_mon,t.tm_mday) #哪个类来调用,即用哪个类cls来实例化

class EuroDate(Date):

def __str__(self):

return 'year:%s month:%s day:%s' %(self.year,self.month,self.day)

e=EuroDate.now()

print(e) #我们想触发EuroDate.__str__,此时e就是由EuroDate产生的,结果如我们所愿

'''

输出结果:

year:2017 month:3 day:3

'''

二、反射

反射:可以用字符串的方式去访问对象的属性,调用对象的方法(但是不能去访问方法),python中一切皆对象,都可以使用反射。

反射有四种方法:

hasattr:hasattr(object,name)判断一个对象是否有name属性或者name方法。有就返回True,没有就返回False

getattr:获取对象的属性或者方法,如果存在则打印出来。hasattr和getattr配套使用

需要注意的是,如果返回的是对象的方法,返回出来的是对象的内存地址,如果需要运行这个方法,可以在后面添加一对()

setattr:给对象的属性赋值,若属性不存在,先创建后赋值

delattr:删除该对象指定的一个属性

1、对象应用反射

class Foo:

def __init__(self):

self.name = 'egon'

self.age = 51

def func(self):

print('hello')

egg = Foo()

print(hasattr(egg,'name')) #先判断name在egg里面存在不存在,结果是True

print(getattr(egg,'name')) #如果为True它才去得到,结果是egon

print(hasattr(egg,'func')) #结果是True

print(getattr(egg,'func')) #得到的是地址>

getattr(egg,'func')() #在这里加括号才能得到,因为func是方法,结果是hello

一般用法如下,先判断是否hasattr,然后取getattr

if hasattr(egg,'func'):

getattr(egg,'func')() #结果是hello

else:

print('没找到')

2、类应用反射

class Foo:

f = 123

@classmethod

def class_method_dome(cls):

print('class_method_dome')

@staticmethod

def static_method_dome():

print('static_method_dome')

print(hasattr(Foo,'class_method_dome')) #结果是True

method = getattr(Foo,'class_method_dome')

method() #结果是class_method_dome

print(hasattr(Foo,'static_method_dome')) #结果是True

method1 = getattr(Foo,'static_method_dome')

method1() #结果是static_method_dome

3、模块应用反射

# 1.导入其他模块引用

import mymodule

print(hasattr(mymodule,'test'))

getattr(mymodule,'test')()

p = getattr(mymodule,'test')

p() #相当于上面getattr(mymodule,'test')()

# 2.在本模块中应用反射

def demo1():

print('hello')

import sys

module_obj = sys.modules[__name__] #相当于'__main__'

print(module_obj) #结果是

print(hasattr(module_obj,'demo1')) #结果是True

getattr(module_obj,'demo1')() #结果是hello

导入自己的模块的例子:

def 注册():

print('regiester')

def 登录():

print('login')

def 购物():

pass

print('注册,登录,购物')

ret = input('请输入你要做的操作:')

import sys

my_module = sys.modules[__name__] #利用sys模块导入一个自己的模块

if hasattr(my_module,ret):

getattr(my_module,ret)()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值