淺談面向對象的認識

基礎

談面向對象就要從他的三大特性開始提及,如:封裝、繼承、多態。python

封裝

方法封裝到類中session

class File():
	def file_add():pass


	def file_update():pass


	def file_del():pass


	def file_fetch():pass  

數據封裝到對象中app

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")   

應用:fetch

- session/request封裝到來RequestContext對象中
- app/g封裝到了AppContext中 spa

繼承

若是多各種中有相同的方法,爲了不重複編寫,能夠將其放在父類(基類)中。rest

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中的視圖類的繼承blog

多態(鴨子類型)

天生支持多態,對於參數來講能夠傳入任何類型的對象,只要保證有想要的相似的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

一、類建立

#方式一:
class Foo(object):pass 
#方式二:
Foo = type('Foo',(object,),{})

二、如何指定由自定義type建立?  

#方式一:
class MyType(type):
	pass 

class Foo(object,metaclass=MyType):
	# __metaclass__ = MyType    # py2
	pass 
#方式二:
Foo = MyType('Foo',(object,),{})

三、默認執行順序 

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__,對象的初始化
相關文章
相關標籤/搜索