澳门至尊网站-首页

您的位置:澳门至尊网站 > 搜索引擎 > python面向对象编制程序

python面向对象编制程序

2019-10-25 03:22

 

一 isinstance(obj,cls)和issubclass(sub,super)

  isinstance(obj,cls)检查是还是不是obj是或不是是类 cls 的对象

1 class Foo(object):
2     pass
3  
4 obj = Foo()
5  
6 isinstance(obj, Foo)

  issubclass(sub, super)检查sub类是还是不是是 super 类的派生类

class Foo(object):
    pass

class Bar(Foo):
    pass

issubclass(Bar, Foo)

 

二、反射

2 python面向对象中的反射:通过字符串的样式操作对象相关的性质。python中的一切事物都以指标(都足以利用反射)

八个能够兑现自省的函数

def getattr(object , name, defalut=None) :

判断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

def setattr(x,y, v):

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

def delattr(x,y):

 

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

 

履行案例

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')#给Blackhouser添加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')

图片 1图片 2

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3  
 4 """
 5 程序目录:
 6     module_test.py
 7     index.py
 8  
 9 当前文件:
10     index.py
11 """
12 
13 import module_test as obj
14 
15 #obj.test()
16 
17 print(hasattr(obj,'test'))
18 
19 getattr(obj,'test')()

View Code

 

3 为啥用反射之反射的益处

 

低价后生可畏:达成可插拔机制

简单来讲反射的益处是,能够先行定义好接口,接口唯有在被成功后才会真正实践,那贯彻了即插即用,那实在是豆蔻梢头种‘后期绑定’,什么意思?即你能够预先把重大的逻辑写好(只定义接口),然后后期再去落到实处接口的功用

 

class FtpClient:
    'ftp客户端,但是还么有实现具体的功能'
    def __init__(self,addr):
        print('正在连接服务器[%s]' %addr)
        self.addr=addr

#from module import FtpClient
f1=FtpClient('192.168.1.1')
if hasattr(f1,'get'):
    func_get=getattr(f1,'get')
    func_get()
else:
    print('---->不存在此方法')
    print('处理其他的逻辑')

动态导入模块

图片 3

 

 

三 __setattr__,__delattr__,__getattr__

class Foo:
    x=1
    def __init__(self,y):
        self.y=y

    def __getattr__(self, item):
        print('----> from getattr:你找的属性不存在')


    def __setattr__(self, key, value):
        print('----> from setattr')
        # self.key=value #这就无限递归了,你好好想想
        # self.__dict__[key]=value #应该使用它

    def __delattr__(self, item):
        print('----> from delattr')
        # del self.item #无限递归了
        self.__dict__.pop(item)

#__setattr__添加/修改属性会触发它的执行
f1=Foo(10)
print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
f1.z=3
print(f1.__dict__)

#__delattr__删除属性的时候会触发
f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
del f1.a
print(f1.__dict__)

#__getattr__只有在使用点调用属性且属性不存在的时候才会触发
f1.xxxxxx

 

四 三遍加工标准项目(包装)

 

打包:python为大家提供了标准数据类型,以至丰盛的松开药方法,其实在大多场景下我们都亟待基于职业数据类型来定制大家温馨的数据类型,新扩展/改写方法,那就用到了咱们刚学的三回九转/派生知识(其余的标准项目均能够透过上边包车型大巴秘技举办三回加工)

 

 

 

授权:授权是包裹的一个风味, 包装三个品种日常是对已存在的品类的一些定制,这种做法能够新建,订正或删除原有产品的功能。其余的则维持原样。授权的长河,便是全体更新的效率都以由新类的某有个别来管理,但已存在的职能就授权给指标的暗许属性。

 

完成授权的关键点便是覆盖__getattr__方法

 

 

import time
class FileHandle:
    def __init__(self,filename,mode='r',encoding='utf-8'):
        self.file=open(filename,mode,encoding=encoding)
    def write(self,line):
        t=time.strftime('%Y-%m-%d %T')
        self.file.write('%s %s' %(t,line))

    def __getattr__(self, item):
        return getattr(self.file,item)

f1=FileHandle('b.txt','w+')
f1.write('你好啊')
f1.seek(0)
print(f1.read())
f1.close()

 

 

叙述符注意事项:

黄金年代描述符本身应当定义成新式类,被代理的类也应当是时尚类
二 必得把描述符定义成这几个类的类属性,无法为定义到构造函数中
三 要严苛遵照该优先级,优先级由高到底分别是
1.类属性
2.数据描述符
3.实例属性
4.非数码描述符
5.找不到的习性触发__getattr__()

其中

数据描述符、数据描述符:至少实现了__get__()和__set__()

非数据描述符、未有兑现__set__()

 

本文由澳门至尊网站发布于搜索引擎,转载请注明出处:python面向对象编制程序

关键词: