码迷,mamicode.com
首页 > 其他好文 > 详细

面向对象进阶

时间:2018-04-19 15:42:01      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:mit   概念   连接服务器   tor   ftp客户端   hid   面向对象   ===   restore   

参考:  http://www.cnblogs.com/linhaifeng/articles/6204014.html

1. 反射

1 什么是反射

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

 

2 python面向对象中的反射:通过字符串的形式操作对象相关的属性。python中的一切事物都是对象(都可以使用反射)

四个可以实现自省的函数

下列方法适用于类和对象(一切皆对象,类本身也是一个对象)

 

技术分享图片
判断object中有没有一个name字符串对应的方法或属性
hasattr(object,name)
技术分享图片
def getattr(object, name, default=None): # known special case of getattr
    """
    getattr(object, name[, default]) -> value

    Get a named attribute from an object; getattr(x, ‘y‘) is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn‘t
    exist; without it, an exception is raised in that case.
    """
    pass

getattr(object, name, default=None)
getattr(object, name, default=None)
技术分享图片
def setattr(x, y, v): # real signature unknown; restored from __doc__
    """
    Sets the named attribute on the given object to the specified value.

    setattr(x, ‘y‘, v) is equivalent to ``x.y = v‘‘
    """
    pass

setattr(x, y, v)
setattr(x, y, v)
技术分享图片
def delattr(x, y): # real signature unknown; restored from __doc__
    """
    Deletes the named attribute from the given object.

    delattr(x, ‘y‘) is equivalent to ``del x.y‘‘
    """
    pass

delattr(x, y)
delattr(x, y)
技术分享图片
class BlackMedium:
    feature=Ugly
    def __init__(self,name,addr):
        self.name=name
        self.addr=addr

    def sell_house(self):
        print(%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼 %self.name)
    def rent_house(self):
        print(%s 黑中介租房子啦,傻逼才租呢 %self.name)

b1=BlackMedium(万成置地,回龙观天露园)

#检测是否含有某属性
print(hasattr(b1,name))
print(hasattr(b1,sell_house))

#获取属性
n=getattr(b1,name)
print(n)
func=getattr(b1,rent_house)
func()

# getattr(b1,‘aaaaaaaa‘) #报错
print(getattr(b1,aaaaaaaa,不存在啊))

#设置属性
setattr(b1,sb,True)
setattr(b1,show_name,lambda self:self.name+sb)
print(b1.__dict__)
print(b1.show_name(b1))

#删除属性
delattr(b1,addr)
delattr(b1,show_name)
delattr(b1,show_name111)#不存在,则报错

print(b1.__dict__)

四个方法的使用演示
四个方法的使用演示
技术分享图片
class Foo(object):
 
    staticField = "old boy"
 
    def __init__(self):
        self.name = wupeiqi
 
    def func(self):
        return func
 
    @staticmethod
    def bar():
        return bar
 
print getattr(Foo, staticField)
print getattr(Foo, func)
print getattr(Foo, bar)

类也是对象
类也是对象
技术分享图片
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys


def s1():
    print s1


def s2():
    print s2


this_module = sys.modules[__name__]

hasattr(this_module, s1)
getattr(this_module, s2)

反射当前模块成员
反射当前模块成员

导入其他模块,利用反射查找该模块是否存在某个方法

技术分享图片
#!/usr/bin/env python
# -*- coding:utf-8 -*-

def test():
    print(from the test)

========================

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
"""
程序目录:
    module_test.py
    index.py
 
当前文件:
    index.py
"""

import module_test as obj

#obj.test()

print(hasattr(obj,test))

getattr(obj,test)()
View Code

 

3. 反射的好处

好处一:实现可插拔机制

有俩程序员,一个lili,一个是egon,lili在写程序的时候需要用到egon所写的类,但是egon去跟女朋友度蜜月去了,还没有完成他写的类,lili想到了反射,使用了反射机制lili可以继续完成自己的代码,等egon度蜜月回来后再继续完成类的定义并且去实现lili想要的功能。

总之反射的好处就是,可以事先定义好接口,接口只有在被完成后才会真正执行,这实现了即插即用,这其实是一种‘后期绑定’,什么意思?即你可以事先把主要的逻辑写好(只定义接口),然后后期再去实现接口的功能

 

技术分享图片
class FtpClient:
    ftp客户端,但是还么有实现具体的功能
    def __init__(self,addr):
        print(正在连接服务器[%s] %addr)
        self.addr=addr
egon还没有实现全部功能
技术分享图片
#from module import FtpClient
f1=FtpClient(192.168.1.1)
if hasattr(f1,get):
    func_get=getattr(f1,get)
    func_get()
else:
    print(---->不存在此方法)
    print(处理其他的逻辑)

不影响lili的代码编写
不影响lili的代码编写

 

好处二:动态导入模块(基于反射当前模块成员)

 

面向对象进阶

标签:mit   概念   连接服务器   tor   ftp客户端   hid   面向对象   ===   restore   

原文地址:https://www.cnblogs.com/yitianyouyitian/p/8883216.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!