zoukankan      html  css  js  c++  java
  • 浅谈面向对象的认识

    基础

    谈面向对象就要从他的三大特性开始说起,如:封装、继承、多态。

    封装

    方法封装到类中

    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__,对象的初始化
    

      

  • 相关阅读:
    Thinking in Ramda: Getting Started
    计算机网络 第一章 绪论(习题)
    URI和URL傻傻分不清
    mac下安装sshpass并配置自动登录
    项目 NodeJS 版本锁定及自动切换
    项目部署篇(一)后端springboot项目打包和部署
    安卓开启GPS,native.js
    native.js,安卓判断APP是否在电池优化白名单
    Self-Supervised Visual Representations Learning by Contrastive Mask Prediction
    wireshark抓包工具使用介绍(附图)
  • 原文地址:https://www.cnblogs.com/gaoya666/p/9210193.html
Copyright © 2011-2022 走看看