💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
## 概述 类是封装逻辑与数据的方式 #### 类间关系 * 依赖(“uses-a”) 一个类的方法操纵另一个类的对象 * 聚合(“has-a”) 类A的对象包含类B的对象 * 继承(“is-a”) 描述特殊与一般的关系 ### 面向对象编程的原则 封装(Encapsulation) * 隐藏实现方案的细节 将**代码与数据**捆绑在一起的一种编程机制,用于保证程序和数据不受外界干扰且不会被误用。 * 继承(Inheritance) 一个对象获得另一个对象属性的过程,用于实现按层分类的概念 一个深度继承的类继承了类层次中每个祖先的所有属性 * 多态(Polymorphism) 允许一个接口被多个通用的类动作使用的特性,一个接口,多种方法,降低程序复杂性 ### 类与模块的关系? 类总是位于模块中,类似模块的属性,类和模块都是命名空间 ### 类属性的创建? 类属性的创建时通过把属性赋值给类对象实现的,类属性由class语句中顶层赋值语句产生的;此外任何引用类对象的地方也可以对其属性赋值,从而创建属性。 ### 实例属性的创建? 实例属性是通过实例对象属性赋值来创建,实例属性一般在class语句中的方法函数中对self参数赋值属性而创建的。此外任何引用实例对象的地方也可以对其属性赋值,从而创建属性。一般来说,实例属性都是在__init__构造函数中初始化。 ### self有什么意义? self通常是类方法中的第一个参数名称,python会自动填入**实例对象**,这个对象的位置才是重点。 ### 类和其他程序单元相比有什么优点? * 多重实例 > 类是产生对象的工厂,每次调用一个类,就会产生一个拥有独立命名空间的新对象,每个对象都能读取类的属性,并在自己的命名空间中存储数据,这些数据对于每个对象来说都不同。 * 通过继承进行定制 > 子类可以继承父类,在父类的基础上加以改造,从而扩充这个类。 * 运算符重载 > 通过特定的协议方法,类可以定义对象来响应在内置类型上的几种运算。 ```python #!/usr/bin/env python # coding: utf-8 def echo(): print 'echo' class GoldenFish(): living_area = 'water' __memory_time = '3 seconds' @staticmethod def breath(): print 'Fish is breathing.' def __init__(self, name, gender): self.name = name self.__gender = gender def eat(self, eat_what, eat_howmuch): print self.name, 'eat', eat_howmuch, eat_what, 'in', self.living_area def memory(self): print 'Fish\'s memory only has %s' % self.__memory_time def __thinkwhat(self): print self.name, 'is think what to eat tommorrow' def sayideas(self): self.__thinkwhat() print self.name, 'is', self.__gender @property def life_span(self): print 'Golden fish can live for ten years' # 先实例化一个对象fishA fishA = GoldenFish('fishA', 'male') # 1 静态和动态, 可以这样理解,静态的是类和对象共有的,动态的是对象私有的 # 静态字段和方法,类和对象都可以访问;动态字段和方法只有对象能访问 # 1.1 通过类访问静态字段 print GoldenFish.living_area # 1.2 通过类访问静态方法 GoldenFish.breath() # 1.3 类不能访问动态字段,报错 # print GoldenFish.name # 1.4 类不能访问动态方法,报错 # GoldenFish.eat('grass', 10) # 1.5 通过对象访问静态字段 print fishA.living_area # 1.6 通过类访问静态方法 fishA.breath() # 1.7 类不能访问动态字段,报错 print fishA.name # 1.8 类不能访问动态方法,报错 fishA.eat('grass', 10) # 2 私有和公有,这是相对于类内和类外来说的 # 私有字段和方法,只能在类内访问,公有字段和方法,类内外都可以访问 # 在类外如果必须访问私有字段和方法,有如下方法,不推荐这样的做法 fshA_GoldenFish____thinkwhat() #包括类和对象的私有方法 print fshA_GoldenFish__memory_time # 包括类和对象的私有字段 # 3 有些函数还是要定义在类外,如echo()函数 ``` #### 什么时候用静态方法? 假如有一个关于操作MsSql数据库的类,使用动态方法,如果有100个业务,需要在(堆|栈)内存创建100个对象,占用空间会比较多; ```python ms = MsSql() ms.add(sql) ``` 如果使用静态方法,直接通过类执行即可,不用创建对象,代码只在code区存储一份 > 因此,静态方法适用于实例化较多对象的场景来减少实例化所带来的内存压力。 ``` MsSql.add(sql) ``` ```python class MsSql(): # 动态方法 def add(self, sql): pass def delete(self, sql): pass def update(self, sql): pass def select(self, sql): pass # 静态方法 @staticmethod def add(sql): pass @staticmethod def delete(sql): pass @staticmethod def update(sql): pass @staticmethod def select(sql): pass ``` #### 什么时候使用特性property? 使用特性property模拟字段的访问方式 #### 什么时候使用私有的 不想让别人看见的或内部处理的 #### 类和字典的关系 类可以打包像字典这样的信息。 * 字典 ![](http://om4h63cja.bkt.clouddn.com/17-3-14/3731443-file_1489477248006_158e6.png) * 类 ![](http://om4h63cja.bkt.clouddn.com/17-3-14/14080462-file_1489477295621_871f.png)