面向对象100解(草稿)

感性角度理解面向对象,启发思路

  • 类内部定义了相关绑定方法,可以把这些绑定方法内部逻辑统一看做一个大的作用域空间,用self来标识。实现了大一统之后,再来看def func(self):pass 定义的小空间,可理解为截取大一统的某段数据对外提供的小接口

  • 实现一个绑定方法 def func(self):pass,已知信息包括,内置函数,内置模块,第三方模块,自定义其他模块的功能方法,以及重要的self,其中有数据属性和方法属性

  • 网络传递信息的时候,必然有请求与响应,可以把所有请求的信息封装成Request对象,从服务器返回的信息封装成Response对象;

  • 设计类时会根据需要初始化属性数据,然后再此基础上定义层级结构良好的绑定方法,requests模块的Response类是特别好的学习案例

  • 类可看做是一系列数据的集合,如ORM,可以在类的基础上,定义不同的函数,如get_custom_by_id, save_custom_info等等,函数内实现各种逻辑判断,调用方直接使用这些函数,不用直接操作底层类,这样结构层次更加清晰

  • self 可以形象的看做一个连接 connection,从而获取自己想要的属性和方法(直接获取返回值,或方法去操作属性,或工具类小功能),定义连接的过程即定义类

self.adapters = {}
self.mount('http', 'adapter1')
self.mount('https', 'adapter2')

def mount(self, prefix, adapter):
    self.adapters[prefix] = adapter

def get_adapter(url):
    for (prefix, adapter) in self.adapters.items():
        if url.lower().startswith(prefix.lower()):
            return adapter

adapter = self.get_adater('http://www.baidu.com')
  • self 可以看做一个存储库,定义类相关字段即属性,属性的值可以直接赋值,也可以通过方法来进行赋值

  • self可以看做一条绳

  • self可以看做一棵树

  • 类绑定方法,可充当创建类实例的工厂方法

class Klass(object):

    @classmethod
    def create(cls):
        # 在此可以实例化对象,联系在函数内部调用函数
        print('cls from create: %s' % id(cls))
        print('Klass from create: %s' % id(cls))

print('Klass from outer: %s' % id(Klass))
Klass.create()

>>> Klass from outer: 2302430114984
>>> cls from create: 2302430114984
>>> Klass from create: 2302430114984

  • 定义一个类,可以看做一个总计划的制定过程,类名即计划项目名,类的继承即公用的计划模板,类的作用域字典即完成计划需要执行的步骤。我们总会说定义类时没有执行,这句话得分开来理解,没有执行的是计划落实的具体步骤,而执行的是制定计划的过程,最后的结果是有类似计划的说明文档,如类的定义

  • 编程可简单理解为对数据的操作,数据+操作,list or dict 首先作为数据的存储容器,然后再附加一些列操作。面向对象中的__init__方法定义了可以存储哪些数据,然后再定义操作这些数据的方法。其实完全可以为各个对象单独定义自己的处理方法,来达到操作数据的目的,但是这样写就会出现大量重复代码,并且函数是无状态的,只要输入值确定,函数的结果都是确定了,所以把函数提升到类的定义中,所有的实例共用类定义的方法即可

  • 继承是面向对象的重要特性,在理解的时候完全可认为复制了父类的功能,粘贴到子类,然后在改改。我们对自己熟悉的操作:复制粘贴,印象深刻,迁移嫁接过去是学习的好方法

  • 一个优秀的类,内部的方法一定是有层级和先后顺序的,如处理MapReduce流程的类,先map,在reduce

  • 宽泛的讲,调用工厂函数list(),类实例化PathInputData(path), LineCountWorker(input_data),都是产生对象的一种方式,甚至@classmethod的绑定方法中实现cls()也可以产生类,要统一理解

  • 我们必须把对象构建出来才能体现出那些类的意义,谁来负责构建对象并协调流程呢?最简单的办法是手工构建相关对象,并通过某些辅助函数将这些对象联系起来。

封装、继承、多态,作用域,产生对象,

Last updated