最近一直在学习面向对象编程的思维,逐渐的理解是最大的收获了,对本周学习的笔记进行一个小结(可能会比较乱),如果有更好的学习方法也请推荐一波吧!
一.面向对象的三个基本特征。
1. 封装性
2. 继承性
3. 多态性
① 定义类:格式:
class 类名(父类):
类体
进一步采用 . or .() 体现类功能
实例变量 | def __init__(self,) |
---|---|
类变量 | 类中的变量,所有实例(或对象)所共有 |
构造方法 | __init__不用传入self参数 |
实例方法 | self.实例变量。 调用实例方法不需传入self参数 |
类方法 | 类对象的方法,由所有实例对象共享。采用 .() or.()注意☆:1.需要加@classmethod装饰器 2. 第一个参数约定为cls |
静态方法 | 定义在类中的普通函数,能够被所有实例对象共享。 采用.() or .() 注意☆:1.静态方法可以没有参数。2.需要加@staticmethod声明3.不可以操作实例属性和实例方法 |
自由方法 | 类中的普通函数。实例方法采用.()方法使用 |
保佑方法 | 由双下划线开始和结束的方法。e.g. __len__() |
私有方法 | 只需要在方法前加双下划线即可def __run(self): 接函数体 |
私有变量:在变量前 下双下划线__,(并非真正私有),如要访问,命名规律为_类名__变量 就可以访问量。
② 继承性
super()函数:可以访问已在类对象中覆盖的继承方法。
@abstractmethod
抽象方法:不能被实例化(创建对象),它的存在就是让更多的人去继承它。
(+一个 个人觉得比较好理解的实例)
from abc import ABCMeta, abstractmethod
class Pet(object, metaclass=ABCMeta):
"""宠物"""
def __init__(self, nickname):
self._nickname = nickname
@abstractmethod
def make_voice(self):
"""发出声音"""
pass
class Dog(Pet):
"""狗"""
def make_voice(self):
print('%s: 汪汪汪...' % self._nickname)
class Cat(Pet):
"""猫"""
def make_voice(self):
print('%s: 喵...喵...' % self._nickname)
def main():
pets = [Dog('旺财'), Cat('凯蒂'), Dog('大黄')]
for pet in pets:
pet.make_voice()
if __name__ == '__main__':
main()
多继承的特点:
当子类实例调用一个方法时,先从子类中查找,如果没有找到则查找父类。
查找顺序安子类声明父类列表从左往右中查找,如找不到父类再找父类的父类。
多态的概念:1.继承——多态发生一定是子类和父类之间
2.重写——子类重写父类的方法
③ 枚举类(本质上也是一种类: import enum)
在python 中定义枚举类语法格式如下:
class 枚举类名 (enum.Enum):
枚举常量列表
枚举类继承自enum.Enum 类。 枚举中会定义多个常量成员。给个示例:
import enum
class WeekDay(enum.Enum):
#枚举常量列表
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
THURSDAY = 4
FRIDAY = 10
day = WeekDays.FRIDAY
print(day)
print(day.value)
print(day.name)
输出结果:
WeekDays.FRIDAY
10
FRIDAY
4.限制枚举类
为了使枚举常量成员只能是整数类型: enum.IntEnum作为父类
防止常量重复: @enum.unique 装饰器(如果常量重复报错)
代码示例:
import enum
@enum.unique #装饰器
class WeekDay(enum.IntEnum): #只能是整数类型
#枚举常量列表
MONDAY = 1
TUESDAY = 2
WEDNESDAY = 3
THURSDAY = 4
FRIDAY = 10
day = WeekDays.FRIDAY
print(day)
print(day.value)
print(day.name)
如果尝试将其中的成员值修改为非整数类型,或者修改相同值,则发生异常。
这次的分享到这里,如有整理错误之处,留下宝贵意见。
希望自己早日脱离小白之称·····