#!/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