【python之路】【之前没搞明白】8面向对象(反射,非常重要)

反射

反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省)。这一概念的提出很快引发了计算机科学领域关于应用反射性的研究。它首先被程序语言的设计领域所采用,并在Lisp和面向对象方面取得了成绩。

  一句话解释:通过字符串的形式操作对象相关的属性

 四个函数:

方法 作用
hasattr(*args, **kwargs)
返回对象里面是否有这个属性

*args:目标实例、对象。eg:p, Person

**kwargs:属性的名字,以字符串形式输入。eg:‘name‘

getattr(object, name, default=None)
获取对象里面的方法

object:目标实例或者方法

name:方面的名字,用字符串形式输入。eg:“walk”

default:不知道啥意思

setattr(x, y, v)--> x.y=z
设置一个属性,还可以赋值

1、新设一个属性,绑定到实例上

2、新设一个方法,绑定到实例上,调用时要传参(self)

3、新设一个方法,绑定到类上,调用时不需传参(self)

delattr(x, y) --> del x.y  删除一个属性 等同于 del object.attr

示例:

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def walk(self):
        print(‘walking‘)

if __name__ == ‘__main__‘:
    p = Person(‘alex‘,24)
    #反射、映射、自省
    # hasattr 判断是否有这个方法
    if hasattr(p,‘name‘):
        print(‘ddd‘)
    # getattr 获取这个方法
    user_comm = input(‘>>:‘).strip()
    if hasattr(p,user_comm):
        func = getattr(p,user_comm)
        func()
    # setattr 赋值
        # 1设立一个属性,绑定到p上
    setattr(p,‘sex‘,‘F‘)
    print(p.sex)
        # 2写个新方法,绑定到实例p上
    def talk(self):
        print(‘talking‘)
    setattr(p,‘talk1‘,talk)
    p.talk1(p) #需要将实例作为参数传入
        # 3方法绑定到类上
    setattr(Person,‘talk2‘,talk)
    p.talk2() #不用传实例作为参数
    # delattr
    delattr(p,‘age‘) # = del p.age
    p.age # AttributeError: ‘Person‘ object has no attribute ‘age‘ 删了就没有这个属性,当然会报错

原文地址:https://www.cnblogs.com/watalo/p/12331618.html

时间: 2024-08-01 19:24:24

【python之路】【之前没搞明白】8面向对象(反射,非常重要)的相关文章

没搞明白fileinput模块的inplace!

__author__ = 'sophi' import fileinput product_list = [] f = open("porduct.txt","r",encoding="utf-8") #打开文件 for line in f.readlines(): line = line.strip() index,item = line.split(":") #冒号分割 product_list.append((index

【python之路】【之前没搞明白】5面向对象(多态)

多态 有时一个对象会有多种表现形式,比如网站页面有个button按钮, 这个button的设计可以不一样(单选框.多选框.圆角的点击按钮.直角的点击按钮等),尽管长的不一样,但它们都有一个共同调用方式,就是onClick()方法.我们直要在页面上一点击就会触发这个方法.点完后有的按钮会变成选中状态.有的会提交表单.有的甚至会弹窗.这种多个对象共用同一个接口,又表现的形态不一样的现象,就叫做多态( Polymorphism ). Polymorphism is based on the greek

【python之路】【之前没搞明白的】6面向对象(编程思路及步骤)

思路 设计功能——使用功能 步骤 光学会了class的语法还不足以让我们学会怎么去编程.就像学会了和水泥.垒砖.刮腻子 但是却不知道怎么去盖楼一样.有个顺序: 1. 定模型 多少个类2. 定属性 每个类需要哪些属性,self.name 这样的3. 定关系 每个类之间有什么关系,继承.依赖.组合.关联4. 画XML图 https://www.processon.com/5. 写代码 这是不是架构师的主要工作! 原文地址:https://www.cnblogs.com/watalo/p/123299

利用NativeWindow监视WndProc消息(好像是一个字典,没搞明白)

http://blog.csdn.net/lovefootball/article/details/1784882 在写Windows应用程序的时候,经常会碰到需要修改例如MessageBox或者FileDialog的外观此时我们需要监视 WndProc的消息当然也可以直接调用API实现,具体方法请参考http://www.codeproject.com/csharp/GetSaveFileName.asp?df=100&forumid=96342&exp=0&select=195

Python之路第一课Day6--随堂笔记(面向对象编程进阶...未完待续 )

本节内容: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 一.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它

poj3687 拓扑排序 还没怎么搞明白 回头再想想

[题意]:n个重量为1~n的球,给定一些球之间的重量比较关系(如 2 1  表示第二个球比第一个球轻),求每个球可能的重量,ans[i] 表示第i个球的重量,要求输出的是ans字典序最小的情况. [思路]:对于给出的a b  建反边,每次 在出度为0的所有点里选一个序号最小的赋值(从n开始 由大到小赋). 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string>

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

七日Python之路--第五天(之找点乐子)

(一)一些闲言碎语 刚才在搜索的时候,看到别人说的一句话,大体意思如下:自从学习Python之后,就不想在学习其他语言了,只想抓紧时间写些有用的东西.细想一下,果真如此. 唉,Python魅力如此之大.感觉比Java容易的多,也可能是小众语言,因为足够小才显得足够强大.算了,不愿多想,还是多写些有意思的东西吧,哈哈. (二)一些有趣的代码 (1)一句话文件服务器 [email protected]:~$ python -m SimpleHTTPServer Serving HTTP on 0.0

python之路,Day24 常用设计模式学习

python之路,Day24 常用设计模式学习 本节内容 设计模式介绍 设计模式分类 设计模式6大原则 1.设计模式介绍 设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一