反射,面对对象高阶

1\  反射

面对对象通常访问属性,是通过  对象.数据属性访问的   可以得到类的,对象的值

class People:
    school=‘oldboy‘
    def __init__(self,name):
        self.name=name

    def tell_info(self):
        print(‘%s is telling‘%self.name)

p=People(‘egon‘)
print(People.school)#oldboy
print(p.name) #egon

现在通过字符串可以得到属性的值

print(hasattr(People,‘school‘))#True  现在可以通过hasattr函数用字符串‘school‘判断能够得到类的值

 print(getattr(People,‘school‘))#oldboy 通过getattr  通过字符串获取值

print(getattr(People,‘sch‘,default=‘no‘))  #,没有‘sch‘,没有找到关键字 参数,就报错
setattr(People,‘x‘,123) #通过字符串形式设置值print(People.x)  #得到值
delattr(People,‘school‘)#通过字符串删除属性和值

hasattr  ,setattr,delattr 都是通过类的属性用字符串来操作值,

#==========对象,通过字符串得到的值

p=People(‘egon‘,‘mail‘)print(hasattr(p,‘name‘))#True 对象通过字符串得到判断print(getattr(p,‘name‘))#egonsetattr(p,‘age‘,11)  #给对象设置新的属性,age,值为11print(getattr(p,‘age‘))#11 getattr 通过字符串得到值

setattr(p,‘age‘,11)  #给对象设置新的属性,age,值为11print(getattr(p,‘age‘))#11 getattr 通过字符串得到值

delattr(p,‘sex‘)   #通过字符串删除对象的属性print(p.__dict__)#‘name‘: ‘egon‘, ‘age‘: 11}

p.tell_info()print(p.school)print(getattr(p,‘tell_info‘))#拿到了绑定方法<bound method People.tell_info of <__main__.People object at 0x0000016D79559D68>>print(getattr(p,‘school‘))p.school=‘ddd‘   #修改了自己的数据属性print(p.__dict__)#{‘name‘: ‘egon‘, ‘sex‘: ‘mail‘, ‘school‘: ‘ddd‘}print(People.__dict__)#{‘__module__‘: ‘__main__‘, ‘school‘: ‘oldboy‘, ‘_类里的没有改动
#===以上都是通过字符串反射得到属性真实的值,  用在与用户的交互的场景

2\  改变对象的字符串显示__str__,__repr__
#自己定义的类在打印时,得到内存地址,
#内置的__str__的方法

class People:
    school=‘oldboy‘
    def __init__(self,name,sex):
        self.name=name
        self.sex=sex
    def tell_info(self):
        print(‘%s is telling‘%self.name)
    def __str__(self):  #一定要返回值,必须是字符串,再打印对象 p 时,就是返回的值了
       # return ‘aaa‘
        return ‘name %s is sex %s‘%(self.name,self.sex)

p=People(‘egon‘,‘mail‘)
print(p)  #p.__str__()
#name egon is sex mail

#不写__str__,打印对象p ,得到的是内存地址,由__str__打印对象p 就得到了对象的值
#直接打印对象p ,得到内存地址,<__main__.People object at 0x00000270DAB99D68>,触发了__str__方法,
#TypeError: __str__ returned non-string (type NoneType)
#报错,返回了不是字符串类型的

# print(p.name)

				
时间: 2024-12-28 17:46:44

反射,面对对象高阶的相关文章

浅析android系统设计中的回调思想

为何写作本文 ??在慢慢深入接触android开发的过程中,我越来越发现android中(至少应用曾的开发)用到了很多回调的思想.比如activity的生命周期,fragment的生命周期,皆是回调函数实现的,android中的事件处理机制其一就是回调,线程方面的异步任务.loader.hanlder等都是基于回调的,等等. ??可见android的其一根本思想就是回调,需要你来参与时,回调用相关的回调方法,你来填充. ??可以说回调的思想浸润与android设计的方方面面,android开发中

Python - 面对对象(其他相关,异常处理,反射,单例模式,等..)

目录 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 二.issubclass(sub, super) 三.异常处理 1. 异常处理 2.异常种类 3.异常其他结构 4.主动触发异常 5.自定义异常 6.断言 四.反射 五. 单例模式 Python - 面对对象(其他相关,异常处理,反射,等..) 一.isinstance(obj, cls) 检查是否obj是否是类 cls 的对象 class Foo(object): pass ob

Python学习:16.Python面对对象(三、反射,构造方法,静态字段,静态方法)

一.构造方法 在使用类创建对象的时候(就是类后面加括号)就自动执行__init__方法. class A: def __init__(self): print('A') class B: def __init__(self): print('B') obj = A() #虽然只是创建了obj对象,但是执行了__init__方法,输出了A Python中派生类可以继承父类的构造方法 1.基于super() 遇到super()就表示去执行父类的xxx属性 class A: def __init__(

接触C# 反射

1.反射的概念详解[1] 1.1 理解C#中的反射 1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内 发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不 知说得是否准确^_^). 2.地球内部结构:地球的内部结构大体可以分为三层:地壳.地幔和地核.地壳是固体,地核是液体,地幔则是半液半固的结构(中学地理的内容

反射,System.Type类

http://m.blog.csdn.net/blog/woddle/40623333 两个现实中的例子:1.B超:大家体检的时候大概都做过B超吧,B超可以透过肚皮探测到你内脏的生理情况.这是如何做到的呢?B超是B型超声波,它可以透过肚皮通过向你体内发射B型超声波,当超声波遇到内脏壁的时候就会产生一定的“回音”反射,然后把“回音”进行处理就可以显示出内脏的情况了(我不是医生也不是声学专家,不知说得是否准确^_^).2.地球内部结构:地球的内部结构大体可以分为三层:地壳.地幔和地核.地壳是固体,地

2016/05/04(反射)

反射:重点----每天都用反射,但是每天都不写反射     Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性. 使用反射可以获得Java类中各个成员的名称并显示出来.简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术. 反射的作用? 可以通过反射机制发现对象的类型,发现类型的方法/属性/构造器? 可以创建对象并访问任意对象方法和属性等 主要点:运行时探究和使用编译时未知的类 Dog d1 = new

Java学习-反射机制入门

1.反射机制 我们在正常的使用过程之中只关心类产生对象,而后通过对象调用类之中的方法,可是,除了这种传统的方式外,也可以利用反射操作. 1.1.认识反射 既然有反,那么一定存在有正,正是指通过类产生对象,而后通过对象执行操作.而反呢?通过对象找到它所在类的信息.所有的对象都支持反这一操作,因为Object类有一个方法:public final Class<?> getClass(). 1 package cn.kvikon.demo; 2 import java.util.Date; 3 4

[转] 优化反射性能的总结(上)

反射是一种很重要的技术,然而它与直接调用相比性能要慢很多,因此如何优化反射性能也就成为一个不得不面对的问题. 目前最常见的优化反射性能的方法就是采用委托:用委托的方式调用需要反射调用的方法(或者属性.字段). 那么如何得到委托呢? 目前最常见也就是二种方法:Emit, ExpressionTree .其中ExpressionTree可认为是Emit方法的简化版本, 所以Emit是最根本的方法,它采用在运行时动态构造一段IL代码来包装需要反射调用的代码, 这段动态生成的代码满足某个委托的签名,因此

任意阶幻方(魔方矩阵)C语言实现

魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为"洛书"或"河图",又叫河洛图. 南宋数学家杨辉,在他著的<续古摘奇算法>里介绍了这种方法:只要将九个自然数按照从小到大的递增次序斜排,然后把上.下两数对调,左.右两数也对调:最后再把中部四数各向外面挺出,幻方就出现了. (摘自<趣味数学辞典>) 在西方