链条传动

砥砺前行,不忘初心!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''
特殊方法
__init__
__del__
__call__
'''

class Foo:
    #构造方法:创建对象时自动执行
    def __init__(self):
        pass

    #析构方法:当某个对象长期不使用,python的垃圾回收机制会将该对象从内存中清理掉
    #在清理前,如果类中定义的析构函数,会先执行一下析构函数,然后再清理该对象
    #如果没有析构函数,就直接进行清理
    def __del__(self):
        pass

    #在对象后面直接加小括号(),会自动执行该方法。如:obj = Foo()   obj()---就会直接执行该方法
    def __call__(self, *args, **kwargs):
        pass

    #创建一个对象后,如果直接print该对象,将会打印出该对象的内存地址
    #如果在类中定义了__str__方法,再print该对象时,就会打印__str__方法的返回值
    def __str__(self):
        return 'hahahaha'



    # 在对象后面直接加中括号[],会自动执行该方法。如:obj = Foo()   obj['xxx']---就会直接执行该方法
    def __getitem__(self, item):
        print(type(item),item)
        if isinstance(item,str):   #判断item是否是str类型
            print(item)
        elif isinstance(item,slice):  #判断item是否是slice类型
            print(item.start,item.stop,item.step)

    #对象赋值的表现形式:obj['k1'] = 'v1'   会自动调用该方法
    def __setitem__(self, key, value):
        print(key,value)

    #删除对象的表现形式:del obj['k1']   会自动调用该方法
    def __delitem__(self, key):
        pass


    #默认情况下对象时不可被迭代的
    #要想对象被迭代,需要__iter__方法,并且该方法的返回值要是个生成器
    def __iter__(self):
        return iter([11,22,33,44])



obj = Foo()
print(obj)  #调用Foo类的__str__方法
print(obj.__dict__)   #获取obj对象中所有封装的字段

print(Foo.__dict__)   #获取类中所有方法

obj['alex']    #自动执行__getitem__方法(参数是str类型)
obj[1:4:2]    #自动执行__getitem__方法(参数是slice类型   1:4:2----start:stop:step)
obj['k1'] = 'v1'   #自动执行__setitem__方法
del obj['k1']   #自动调用__delitem__方法


#迭代对象会自动执行类的__iter__方法,没有会报错(默认对象时不可被迭代的)
for item in obj:
    print(item)

 

#! /usr/bin/env python
# -*- coding: utf-8 -*-

"""
class 特殊方法  :
__enter__
__exit__
"""


class SQLHelper(object):
    """
    sql打开连接,执行命令,关闭连接
    """
    def open(self):
        pass

    def fetch(self, sql):
        pass

    def close(self):
        pass

    def __enter__(self):
        self.open()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.close()


if __name__ == '__main__':
    with SQLHelper() as obj:        # 使用with,会自动调用类中的__enter__方法,obj就是__enter__的返回值
        obj.fetch('select xxxx')
        # 当命令执行完后,会自动调用类中的__exit__方法

    """等价于"""
    obj = SQLHelper()
    obj.open()   # 打开sql连接
    obj.fetch()  # 执行sql命令
    obj.close()  # 关闭sql连接

 

"""
__dict__方法
"""

class Foo(object):
    AGE = 23

    def __init__(self, name):
        self.name = name


print(Foo.__dict__)    # 类的__dict__方法,查看类中拥有的东西:AGE字段、__init__方法

obj = Foo('alex')
print(obj.__dict__)   # 对象的__dict__方法,查看对象拥有的东西:name:alex

 

 

其他

#!/usr/bin/env python
# -*- coding: utf-8 -*-


class Bar:
    pass

class Foo(Bar):
    pass


obj = Foo()
print(isinstance(obj,Foo))   #判断obj是不是Foo的对象,是则返回True
print(isinstance(obj,Bar))   #判断obj(或obj类型的父类)是不是Bar的对象,是则返回True




print(issubclass(Foo,Bar))   #判断Bar是否是Foo的子类,是则返回True

 

posted on 2016-11-07 13:55  链条君  阅读(193)  评论(0编辑  收藏  举报