面向对象(python)
面向对象
对于编程的好处
将一个事物的技能和属性封装需要的时候调用
类
对于有相同特征事物的描述
对象
由类生产出对象
class person:
p = person() # 生产对象的过程
-
把类比作成工厂 调用类的时这个操作是类的实例化过程(生产一个对象)
-
对象是 方法和属性的集合
-
方法就是函数
-
属性可以通过调用对象直接生成属性
自我介绍
-
对象:
具体事物称之为一个对象
比如(手机, 杯子, 耳机, 键盘) -
类:
类似对象的集合称之为类
有着相似功能 属性的事物叫做类
比如说手机 华为 vivo 除了 品牌 内核...不同 但它们都叫手机 -
属性:
比如说 (人)的 身高, 体重, 兴趣爱好... 都是人的属性 -
方法:
比如说你的技能 ,你会 跑, 跳, 爬, 走 这些属于对象的方法 -
命名规范
多个单词组成使用 驼峰命名法
类的 类名必须首字母大写 -
所有类默认继承的是 object(python所有类的集合)
class person:
# 类的所有属性
readme = "这是一个人的类"
def __init__(self, name, sex, height)
类实例化后的对象的属性的集合
self 指 类实例化后的对象的属性
self.name = name
self.sex = sex
self.height = height
def ran(self, stop)
print("每一步{}米".format(stop))
# 属性
#方法
实例化一个对象
per1 = person("kyle", "N", 190)
per1.readme
调用 类的属性
class_att = person.readme
print(class_att)
调用 对象的属性
name = per1.name
print(name)
out: kyle
"""
如果对象没有调用的属性会报错
查找属性时先到对象属性里找 再去 类属性里找
"""
添加对象的属性
直接在外部赋值
per1.interests = ["run", "python"]
调用 对象的方法
per1.run(0.7)
面向对象的三大特性
封装,继承,多态
- 封装:
将方法封装 变成私有 限制只能在外部操作
将不想对外开放的接口隐藏起来
ran()单下划线开头 结尾的 告诉他人这是私有方法 我没有做限制
双下划线开头结尾的 python内部将名字修改 封装不是目的 是对于属性的限制,确保安全性
-
继承:
所有类的父类默认继承object 而object的父类是type
多继承
查找顺序
print(Person.mro)返回继承关系的序列
如果 类继承的一个是同一个类 会最后指向 -
多态:
1.相同的方法作用在不同对象上返回不同的结果
2.无需考虑实例化对象的具体类型 只要知道方法
3.增加程序的灵活和可拓展性
4.统一接口
鸭子类型 :我认为他是什么他就是什么
功能和名字统一
类方法
在 一个方法加一个装饰器 @classmothod 把一个对象方法变成类方法
类方法尽量通过类来调用 参数 cls---> 指向的是类本身
类的方法 在 声明类的内存空间时执行
类方法只能使用类属性
类不可以使用对象的方法
作用
在对象创建之前 执行一些动作
- 静态方法
类似类方法
- @staticmethod
加上可以不填self这个参数 - 静态方法无需传递参数(cls, self)
3.只能访问类的属性和方法, 对象的是无法访问的
4.加载时机同类方法
作用:
静态方法
不同: 装饰器不同 类方法是由参数的,静态是没有参数的
相同 :
只能访问类的属性和方法, 对象的方法是无法访问的
都可以通过类名访问
都在创建对象之前执行
-
装饰器函数
@property 把一个方法 进行装饰 让他可以和属性一样调用 -
内置方法
isinstance()判断对象是由哪个类实例化出来的
issubclass(要检查的类, 类的父类) 检测一个类继承的父类
反射(类)
hasattr(实例化对象的名字, 属性名)
尖刺是否有某个方法
getattr(对象的名字, 方法或名字, 如果找不到返回内容)
classname.dict()获取对象的所有属性
delattr(类名,类里有的属性如果没有会报错)
callable()函数是否可以调用
约束规则
相同的需求 接口统一
完善限制 把一些已知报错触发 用raise 接收错误信息
魔法方法
构造方法和__init__方法
以下是伪代码
def __new__ (cls):# 构造方法 执行__init__函数之前执行
return object.__new__(cls,*args, **kwargs)开辟空间函数
new方法执行后会传给__init__方法
def __init__(self):# 初始化方法
# 代码解析 伪代码 cls_name.__new__()
def __call__(self): 对象调用方法
将对象当成函数调用时触发此方法
只要实例化对象后面加上括号就会执行此函数
def __del__(): 析构魔术方法
触发时机
当前对象空间无任何引用时会触发此函数
查看有多少变量引用的 单个对象地址 sys.getrefcount(object)-1 当前调用此方法也引用一次
def __str__(self):当对象名被打印或用str调用时执行次方法
class PresonO:
def __init__(self):
pass
# 不冲写会打印对象的内存地址
def __str__(self):
return ""
p = PresonO()
print(p)
-
单例模式
当创建对象时每次创建都是重新开辟一块内存空间
如果有特殊需求 需要每次实例化对象都生成单个对象就需要用到单例模式 -
解析代码
声明一个变量用于存储 内存地址
如果这个地址等于None就说明第一次调用 所以讲此内存地址赋值给 此变量 然后返回此变量
如果不等于None 就说明已经是第二次调用了 所以直接返回 此变量
class PresonO:
__instance = None
def __init__(self):
pass
def __new__(cls):
if __instance is None:
cls.__instance = object.__new__(cls)# 开辟空间
return object.__new__(cls)# 开辟空间
else:
return cls.__instance # 将内存空间返回
p = PresonO()
print(p)

浙公网安备 33010602011771号