面向对象编程思想之路···

面向对象笔记整理

最近一直在学习面向对象编程的思维,逐渐的理解是最大的收获了,对本周学习的笔记进行一个小结(可能会比较乱),如果有更好的学习方法也请推荐一波吧!

一.面向对象的三个基本特征。

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 类。 枚举中会定义多个常量成员。给个示例:

扫描二维码关注公众号,回复: 11178874 查看本文章
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)

如果尝试将其中的成员值修改为非整数类型,或者修改相同值,则发生异常。

这次的分享到这里,如有整理错误之处,留下宝贵意见。
希望自己早日脱离小白之称·
····

原创文章 27 获赞 34 访问量 2615

猜你喜欢

转载自blog.csdn.net/weixin_46313446/article/details/105642490