浅谈面向对象的认识
基础
谈面向对象就要从他的三大特性开始说起,如:封装、继承、多态。
封装
方法封装到类中
class File(): def file_add():pass def file_update():pass def file_del():pass def file_fetch():pass
数据封装到对象中
class File():
	def __init__(self,name,age,email):
		self.name = name 
		self.age = age 
		self.email = email 
	def file_add():pass
	def file_update():pass
	def file_del():pass
	def file_fetch():pass
obj1 = File('oldboy',19,"asdf@live.com")
obj2 = File('oldboy1',119,"asdf12@live.com")   
应用:
- session/request封装到来RequestContext对象中
							- app/g封装到了AppContext中 
继承
如果多各类中有相同的方法,为了避免重复编写,可以将其放在父类(基类)中。
class Base(object): def xxxx():pass class File(Base): def __init__(self,name,age,email): self.name = name self.age = age self.email = email def file_add():pass def file_update():pass def file_del():pass def file_fetch():pass class DB(Base): def db_add():pass def db_update():pass def db_del():pass def xxxx():pass def db_fetch():pass
应用:
rest framework中的视图类的继承
多态(鸭子类型)
天生支持多态,对于参数来说可以传入任何类型的对象,只要保证有想要的类似的send方法即可。
class Msg(object): def send(): pass class WX(object): def send(): pass def func(arg): arg.send()
进阶
__init__,初始化 __new__,创建对象 __call__,对象() __getattr__,对象.xx __setattr__ __delattr__ __setitem__,对象['xx'] __getitem__ __delitem__ __mro__,查找成员顺序 __str__ __repr__ __iter__ __dict__ __add__
高级:metaclass
1、类创建
#方式一:
class Foo(object):pass 
#方式二:
Foo = type('Foo',(object,),{})
2、如何指定由自定义type创建?
#方式一:
class MyType(type):
	pass 
class Foo(object,metaclass=MyType):
	# __metaclass__ = MyType    # py2
	pass 
#方式二:
Foo = MyType('Foo',(object,),{})
3、默认执行顺序
class Foo(object,metaclass=MyType):
	pass 
	
obj = Foo()
class MyType(type):
	def __init__(self,*args,**kwargs):
		print('111')
		super(MyType,self).__init__(*args,**kwargs)
class Base(object, metaclass=MyType):
	pass
class Foo(Base):
	pass
如果一类自己或基类中指定了metaclass,那么该类就是由metaclass指定的type或mytype创建。
同:
	class MyType(type):
		def __init__(self,*args,**kwargs):
			print('111')
			super(MyType,self).__init__(*args,**kwargs)
	# class Base(object, metaclass=MyType):
	#     pass
	Base = MyType('Base',(object,),{})
	class Foo(Base):
		pass
同:
	class MyType(type):
		def __init__(self,*args,**kwargs):
			print('111')
			super(MyType,self).__init__(*args,**kwargs)
	# class Base(object, metaclass=MyType):
	#     pass
	def with_metaclass(arg):
		Base = MyType('Base',(arg,),{})
		return Base
	class Foo(with_metaclass(object)):
		pass
- 创建类时,先执行type的__init__。
- 类的实例化时,执行type的__call__,__call__方法的的返回值就是实例化的对象。
	__call__内部调用:
		- 类.__new__,创建对象
		- 类.__init__,对象的初始化

                
            
        
浙公网安备 33010602011771号