python面向对象之反射
admin
2023-07-21 05:02:29
0

一、静态方法(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)()



相关内容

热门资讯

意大利总理回击特朗普批评:应关... △意大利总理梅洛尼(资料图)意大利总理梅洛尼20日就美国总统特朗普针对其政府的最新批评作出回应,称特...
以总理及防长被曝已命令以军在黎... 据以色列方面20日消息,以色列总理内塔尼亚胡和国防部长卡茨已下达指令,要求以军在黎巴嫩停火。根据该指...
梁文杰称台湾人几乎不吃凤梨释迦... 海峡导报综合报道 台陆委会副主委梁文杰18日称凤梨释迦“台湾人几乎不吃,是仰大陆鼻息的农产品”,引起...
伊朗谈判代表已启程前往瑞士 据伊朗方面20日消息,伊朗谈判代表已启程前往瑞士,就谅解备忘录与美方进行讨论。6月20日,巴基斯坦外...
美军称暂未观察到伊朗关闭霍尔木... 新华社华盛顿6月20日电 据美国媒体20日援引美国高级官员的话报道称,美军暂未观察到伊朗关闭霍尔木兹...
万亿市场,“爆发前夜” 就在SpaceX6月12日完成纳斯达克首秀前,创始人埃隆·马斯克在一场访谈上确认,SpaceX正在开...
乌俄互指对方在赫尔松州发动袭击 乌克兰赫尔松州军事管理局20日在社交媒体发文称,截至当天早上6时,赫尔松州乌控区在过去24小时内遭俄...
伊朗外长将与巴基斯坦内政部长一... 当地时间20日,有消息显示,伊朗外长阿拉格齐20日晚将与巴基斯坦内政部长纳克维一同前往瑞士。伊朗外交...
文博日历丨早在8000年前 古... 端午假期各地特色龙舟活动轮番亮相其实,早在8000年前先民们就已经是有船一族了今天带你一起解锁“远古...
凤凰晚报丨35岁宝妈亲手勒死3... 今日人物【35岁宝妈亲手勒死3个娃,丈夫:不怪她】最近,美国马萨诸塞州一起震惊全美的“杀婴案”再次开...