类的进阶四

一 反射的基本概念

  1 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力。

  最根本的就是,操作字符串,根据字符串找到相应的属性,映射到真正的功能上。

  反射说简单点 --> 就是利用字符串的形式去对象(模块)中操作(寻找/检查/删除/设置)成员。

  示例一

class Foo:
    def foo(self):
        print(‘from Foo.foo‘)
f=Foo()
print(Foo.foo)
print(getattr(Foo,‘foo‘))
print(f.foo)
print(getattr(f,‘foo‘))

  输出:  getattr(x, ‘y‘) is equivalent to x.y

<function Foo.foo at 0x000001F3391FA8C8>
<function Foo.foo at 0x000001F3391FA8C8>
<bound method Foo.foo of <__main__.Foo object at 0x000001F3391FC470>>
<bound method Foo.foo of <__main__.Foo object at 0x000001F3391FC470>>

  示例二

class Foo:
    def foo(self):
        print(‘from Foo.foo‘)
f=Foo()

getattr(f,‘foo‘)()

f.foo()

  输出:  可以看出  getattr(x, ‘y‘) is equivalent to x.y

from Foo.foo
from Foo.foo

  2 好基友

    getattr 与 hasattr的搭配

  示例:

class Foo:
    def foo(self):
        print(‘from Foo.foo‘)
f=Foo()

if hasattr(f,‘foo‘):
    getattr(f,‘foo‘)()
if hasattr(f,‘bar‘):
    getattr(f,‘bar‘)()

  输出:

from Foo.foo

  3 setattr,delattr

class Teacher:
    def __init__(self,name,age):
        self.name=name
        self.age=age
egon=Teacher(‘egon‘,18)
setattr(egon,‘level‘,10)
print(egon.__dict__)
delattr(egon,‘name‘)
print(egon.__dict__)

  输出:

{‘name‘: ‘egon‘, ‘age‘: 18, ‘level‘: 10}
{‘age‘: 18, ‘level‘: 10}

二 反射的应用。

  反射非常重要

class func:
    def foo(self):
        print(‘foo‘)
    def bar(self):
        print(‘bar‘)
f=func()
cmd=input(‘==>‘)
if hasattr(f,cmd):
    getattr(f,cmd)()

  输出:

==>foo
foo

  

  进阶的示例。非常重要的模型。

class Cmd:
    def __init__(self,name):
        self.name=name
    def run(self):
        while True:
            cmd=input(‘==>‘)
            if not cmd:continue    #空就继续循环,输入
            if hasattr(self,cmd):  # 判断有没有字符串对应的属性
                getattr(self,cmd)()
    def ls(self):
        print(‘ls func‘)
    def dir(self):
        print(‘dir func‘)
egon=Cmd(‘egon‘)
egon.run()

  输出:

==>
==>foo
==>bar
==>ls
ls func
==>

二 内置方法

  1 __str__

class Teacher:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return ‘‘‘
        name:%s
        age:%s
        ‘‘‘%(self.name,self.age)
egon=Teacher(‘egon‘,18)
print(egon)

  输出:

name:egon
        age:18
        

  print 自动触发__str__方法,执行其代码。可以代替tell_info方法。

  2 __getitem__   __setitem__  __delitem__ 列表,字典也是类的对象,所以应该会有以 [ ]取值的方法。模拟列表,字典中括号取值的方式。

class Teacher:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __getitem__(self, item):
        print(self,item,type(item))
egon=Teacher(‘egon‘,18)
egon[‘name‘]            #只要以中括号调用其属性时,触发getitem方法
print(egon[‘name‘])     #没有返回值

  输出:

<__main__.Teacher object at 0x000001DBF55FC438> name <class ‘str‘>
<__main__.Teacher object at 0x000001DBF55FC438> name <class ‘str‘>
None

  __setitem__示例

class Teacher:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __getitem__(self, item):
        print(self,item,type(item))
    def __setitem__(self, key, value):
        # setattr(self,key,value)
        self.__dict__[key]=value  #这是更本质的方法
egon=Teacher(‘egon‘,18)
egon[‘level‘]=10
print(egon.__dict__)

  输出:

{‘name‘: ‘egon‘, ‘age‘: 18, ‘level‘: 10}

  

时间: 2024-08-06 05:05:34

类的进阶四的相关文章

J2EE进阶(四)Spring配置文件详解

J2EE进阶(四)Spring配置文件详解 前言 Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸".Java EE程序员必须学会并灵活应用这份"图纸"准确地表达自己的"生产意图".Spring配置文件是一个或多个标准的XML文档,applicationContext.xml是Spring的默认配置文件,当容器启动时找不到指定的配置文档时,将会尝试加载这个默认的配置文件. 下面列举的是

AngularJS进阶(四十)创建模块、服务

AngularJS进阶(四十)创建模块.服务 学习要点 使用模块构架应用 创建和使用服务 为什么要使用和创建服务与模块? 服务允许你打包可重用的功能,使之能在此应用中使用. 模块允许你打包可重用的功能,使之能跨应用使用. 一.应用程序模块化 先看看一个没有模块化的程序 <!DOCTYPE> <!-- use module --> <html ng-app="exampleApp"> <head> <title>Angluar

4. 蛤蟆的数据结构进阶四静态查询之索引顺序查询

4. 蛤蟆的数据结构进阶四静态查询之索引顺序查询 本篇名言:"凡是新的事情在起头总是这样一来的,起初热心的人很多,而不久就冷淡下去,撒手不做了,因为他已经明白,不经过一番苦工是做不成的,而只有想做的人,才忍得过这番痛苦. --陀思妥也夫斯基" 我们继续静态查询的索引顺序查询. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/47264703 1.  索引顺序查询 首先把表长为n的线性表分成b块,前b-1块记录个数为s

网站开发进阶(四十一)中文字体网页开发指南

网站开发进阶(四十一)中文字体网页开发指南 前言 字体的选择,是网页开发的关键因素之一. 合适的字体,对网页的美观度(或可读性)有着举足轻重的影响.   但是,相比英文字体,中文字体的网页开发有着极大的局限性.因为,一套中文字体最少也要有几千个字符,体积为几个MB:单单为了浏览网页,开发者不可能让用户去下载字体,只能依靠操作系统的预装字体.(*注:确实有网站提供中文字体的web服务,从技术角度,我不推荐这样做.) 不同的操作系统.不同的版本预装不同的字体(因为版权),几乎没有交集.因此,大多数开

java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)

上一节售票系统中我们发现,打印出了错票,0,-1,出现了多线程安全问题.我们分析为什么会发生多线程安全问题? 看下面线程的主要代码: @Override public void run() { // TODO Auto-generated method stub while(true){ if(ticket > 0){//当线程0被调起的时候,当执行到这条判断语句的时候,线程1被调起抢了CPU资源,线程0进入冻结状态. try { Thread.sleep(100);//中断当前活跃的线程,或者

Python进阶(四十)-数据可视化の使用matplotlib进行绘图

Python进阶(四十)-数据可视化の使用matplotlib进行绘图 前言 ??matplotlib是基于Python语言的开源项目,旨在为Python提供一个数据绘图包.我将在这篇文章中介绍matplotlib API的核心对象,并介绍如何使用这些对象来实现绘图.实际上,matplotlib的对象体系严谨而有趣,为使用者提供了巨大的发挥空间.用户在熟悉了核心对象之后,可以轻易的定制图像.matplotlib的对象体系也是计算机图形学的一个优秀范例.即使你不是Python程序员,你也可以从文中

java工具类系列 (四.SerializationUtils)

java工具类系列 (四.SerializationUtils) SerializationUtils该类为序列化工具类,也是lang包下的工具,主要用于序列化操作 import java.io.Serializable;

Python进阶(四十九)-初识Flask Blueprint

Python进阶(四十九)-初识Flask Blueprint 前言   在进行Python Web开发时选择Flask框架.项目模块划分阶段,使用Blueprint(这里暂且称之为“蓝本”).Blueprint通过把实现不同功能的module分开,从而把一个大的application分割成各自实现不同功能的module.在一个Blueprint中可以调用另一个blueprint的view function, 但要加相应的blueprint名.   Blueprint还有其他好处,其本质上来说就

python进阶四(类的继承)【4-1 python中继承一个类】

python中继承一个类 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: 1 class Person(object): 2 def __init__(self, name, gender): 3 self.name = name 4 self.gender = gender 定义Student类时,只需要把额外的属性加上,例如score: 1 class Student(Person): 2 def __init__(self, n