python 之 面相对象内置方法(待续)

常用内置方法

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

isinstance(obj,cls)检查对象obj是否是类cls的对象

class Foo(object):
    pass
obj = Foo()
isinstance(obj, Foo)

issubclass(sub,super)检查子类sub是否是super类的派生类

class Foo(object):
    pass
class Bar(Foo):
    pass
issubclass(Bar, Foo)


二、item系列

把对象做成一个像字典对象一样的,字典一样去操作

class Foo: #Dict
    def __init__(self,name):
        self.name=name

    def __getitem__(self, item): #item='namexxx'
        # print('getitem...')
        return self.__dict__.get(item)

    def __setitem__(self, key, value):
        # print('setitem...')
        # print(key,value)
        self.__dict__[key]=value

    def __delitem__(self, key):
        # print('delitem...')
        # print(key)
        del self.__dict__[key]

obj=Foo('egon')
print(obj.__dict__)


# 查看属性:
# obj.属性名
print(obj['namexxx']) #obj.name


# 设置属性:
obj.sex='male'
obj['sex']='male'

print(obj.__dict__)
print(obj.sex)


# 删除属性
del obj.name
del obj['name']

print(obj.__dict__)

只要在类内部去定义一些__开头,__结尾的方法,这些方法就可以在某种情况下,自动触发执行,帮我来把我的类完成一个定制化的效果

三、__str__方法

让打印的对象变得有意义,

在打印的时候,触发方法,把返回的结果,作为打印的信息

注意:方法的返回值必须是字符串,否则抛出异常
class People:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __str__(self):
        # print('====>str')
        return '<name:%s,age:%s>' %(self.name,self.age)

obj=People('egon',18)
print(obj) #res=obj.__str__()


四、__del__

析构方法,当对象在内存中被释放时,自动触发执行。

注:如果产生的对象仅仅只是python程序级别的(用户级),那么无需定义__del__,如果产生的对象的同时还会向操作系统发起系统调用,即一个对象有用户级与内核级两种资源,比如(打开一个文件,创建一个数据库链接),则必须在清除对象的同时回收系统资源,这就用到了__del__。

class Open:
    def __init__(self,filename):
        print('open file.......')
        self.filename=filename

    def __del__(self):
        print('回收操作系统资源:self.close()')

f=Open('settings.py')
# del f #f.__del__()
print('----main------') #程序执行完毕,开始回收del f #f.__del__()

总结一下:在类内部定义了一个__del__方法,这个方法就会在兑现干杯删除或者回收之后,自动触发

下面是两个简单的示范

先del

class Foo:

    def __del__(self):
        print('执行我啦')

f1=Foo()
del f1
print('------->')

#输出结果
执行我啦
------->

简单示范

不要del

class Foo:

    def __del__(self):
        print('执行我啦')

f1=Foo()
# del f1
print('------->')

#输出结果
------->
执行我啦





#为何啊???

典型的应用场景:

创建数据库类,用该类实例化出数据库链接对象,对象本身是存放于用户空间内存中,而链接则是由操作系统管理的,存放于内核空间内存中

当程序结束时,python只会回收自己的内存空间,即用户态内存,而操作系统的资源则没有被回收,这就需要我们定制__del__,在对象被删除前向操作系统发起关闭数据库链接的系统调用,回收资源


内置方法(二)

待续

posted @ 2018-06-02 19:52  游小刀  阅读(125)  评论(0编辑  收藏  举报
levels of contents