談面向對象就要從他的三大特性開始提及,如:封裝、繼承、多態。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__
#方式一: class Foo(object):pass #方式二: Foo = type('Foo',(object,),{})
#方式一: 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__,對象的初始化