python攻城狮004--面向对象

python攻城狮004–面向对象

之前三篇
001-函数技巧\变量\包\标准库
002-高阶函数技巧-lambda\filter\map\reduce 函数
003–文件の读写


面向对象编程思想:

  • 面向对象编程概述
  • 面向对象编程实现
  • 面向对象编程应用
  • 内存管理
  • 进程\线程\协程 概念及学习

概述

自然界

  • 自然界 ---- ‘万物皆对象’
  • 面向对象:与对象面对面,关注它

编程界

  • 是模子,确定对象会拥有它的属性 & 方法(抽象的)
  • 对象的实例(看得见摸得到)
  • 类是对象的类型
  • 对象是特定类型的数据

属性和方法

  • 属性 :对象具有的各种静态特征
  • 方法 :对象具有的各种动态行为

面向对象优点


面向对象的三大特征

封装

将类的某些信息进行隐藏在内部,不允许外部程序直接访问.
特点是:只能通过规定方法访问数据;隐藏类的实例和细节,方便修改和实现.

  • 通过该类提供的方法来实现对隐藏信息的操作和访问
  • 隐藏对象的信息
  • 流出访问的接口

举例 : ATM 取钱 ; 接口:插卡\输密码\操作屏

继承

什么是继承 : 就是继承的属性 ,又分为 公有和私有属性
以动物举例:

  • 私有: 名字\年龄\性别
  • 公有: 吃\睡\跑 等

基 类 :父类
派生类 : 子类

多态

意味着:允许不同类的对象,对同一消息有不一样的响应

  • 满足继承关系
  • 需要方法的重写

类高级特性 : @property \ slots: \ 静态方法 \ 类的方法

  1. @property: 将类的方法当做属性来用
    代码表示如下:

class PetCat(object):
    """ 家猫类 """

    def __init__(self, name, age):
        """
        构造方法
        :param name: 猫吃的名称
        :param age: 猫的年龄
        """
        self.name = name
        # 私有属性,不能给你们操作
        self.__age = age

    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self, value):
        if not isinstance(value, int): # 判断是不是int
            print('年龄只能是整数')
            return 0
        if value < 0 or value > 100:
            print('年龄只能介于0-100之间')
            return 0
        self.__age = value

    # 描述符
    @property
    def show_info(self):
        """ 显示猫的信息 """
        return '我叫:{0},今年{1}岁'.format(self.name, self.age)

    def __str__(self):
        return '我的对象: {0}'.format(self.name)


if __name__ == '__main__':
    cat_black = PetCat('小黑', 2)
    rest = cat_black.show_info
    print(rest) # 我叫小黑,今年2岁
    # 改变猫的age
    cat_black.age = 'hello'   # 负的 \ 超100 \字符串 都不行
    rest = cat_black.show_info
    print(rest)
    # print(cat_black)

  1. __slots__: 为指定的类设置一个静态属性列表 ; 为属性很少的类节约内存空间
class PetCat(object):
    """ 家猫类 """

    __slots__ = ('name', 'age')

    def __init__(self, name, age):
        """
        构造方法
        :param name: 猫吃的名称
        :param age: 猫的年龄
        """
        self.name = name
        # 私有属性,不能给你们操作
        self.age = age

    # 描述符
    @property
    def show_info(self):
        """ 显示猫的信息 """
        return '我叫:{0},今年{1}岁'.format(self.name, self.age)

    def __str__(self):
        return '我的对象: {0}'.format(self.name)


class HuaCat(PetCat):
    """ 中华田园猫 """
    __slots__ = ('color', )  #这个slots后边加了东西
    pass


def eat():
    print('我喜欢吃鱼')


if __name__ == '__main__':
    # cat_black = PetCat('小黑', 2)
    # rest = cat_black.show_info
    # print(rest)
    # # 给实例添加新的属性
    # cat_black.color = '白色'
    # print(cat_black.color)
    # # 给实例添加新的方法(函数)
    # cat_black.eat = eat
    # cat_black.eat()

    # 使用slots后不允许给实例添加新的属性
    # cat_black.color = '白色'
    # print(cat_black.color)
    # 使用slots后给实例添加新的方法(函数)
    # cat_black.eat = eat
    # cat_black.eat()

    cat_white = HuaCat('小白', 3)
    rest = cat_white.show_info
    print(rest)  # 我叫:小白,今年3岁
    cat_white.color = '白色'
    print(cat_white.color) # 白色
    cat_white.name = '旺旺' 
    print(cat_white.show_info) #我 叫:旺旺,今年3岁
 

类的静态方法和实例方法

  • @staticmethod 表示静态方法
  • @classmethod 表示类的方法


class Cat(object):

    tag = '猫科动物'

    def __init__(self, name):
        self.name = name

    @staticmethod
    def breath():
        """ 呼吸 """
        print('猫都需要呼吸空气')

    @classmethod
    def show_info(cls, name):
        """ 显示猫的信息 """
        # print('类的属性:{0}, 实例的属性: {1}'.format(cls.tag, cls.name))
        return cls(name)
        # cat = Cat(name)
        # return cat

    def show_info2(self):
        """ 显示猫的信息 """
        # 设计模式
        print('类的属性:{0}, 实例的属性: {1}'.format(self.tag, self.name))


if __name__ == '__main__':
    # 通过类进行调用
    Cat.breath()
    cat = Cat('小黑')
    # # 通过类的实例进行调用
    cat.breath()
    cat.show_info2()

    # 调用classMethod
    cat2 = Cat.show_info('小黄')
    cat2.show_info2()

"""
猫都需要呼吸空气
猫都需要呼吸空气
类的属性:猫科动物, 实例的属性: 小黑
类的属性:猫科动物, 实例的属性: 小黄
"""
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章