python攻城狮004–面向对象
之前三篇
001-函数技巧\变量\包\标准库
002-高阶函数技巧-lambda\filter\map\reduce 函数
003–文件の读写
面向对象编程思想:
- 面向对象编程概述
- 面向对象编程实现
- 面向对象编程应用
- 内存管理
- 进程\线程\协程 概念及学习
概述
自然界
- 自然界 ---- ‘万物皆对象’
- 面向对象:与对象面对面,关注它
编程界
类
是模子,确定对象会拥有它的属性 & 方法(抽象的)对象
是类
的实例(看得见摸得到)- 类是对象的类型
- 对象是特定类型的数据
属性和方法
属性 :
对象具有的各种静态特征
方法 :
对象具有的各种动态行为
面向对象优点
面向对象的三大特征
封装
将类的某些信息进行隐藏在内部,不允许外部程序直接访问.
特点是:只能通过规定方法访问数据;隐藏类的实例和细节,方便修改和实现.
- 通过该类提供的方法来实现对隐藏信息的操作和访问
- 隐藏对象的信息
- 流出访问的接口
举例
: ATM 取钱 ; 接口:插卡\输密码\操作屏
继承
什么是继承 : 就是继承的属性 ,又分为 公有和私有属性
以动物举例:
- 私有: 名字\年龄\性别
- 公有: 吃\睡\跑 等
基 类 :
父类
派生类 :
子类
多态
意味着:
允许不同类的对象,对同一消息有不一样的响应
- 满足继承关系
- 需要方法的重写
类高级特性 : @property \ slots: \ 静态方法 \ 类的方法
- @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)
__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()
"""
猫都需要呼吸空气
猫都需要呼吸空气
类的属性:猫科动物, 实例的属性: 小黑
类的属性:猫科动物, 实例的属性: 小黄
"""