Loading

面向对象(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---> 指向的是类本身

类的方法 在 声明类的内存空间时执行
类方法只能使用类属性
类不可以使用对象的方法

作用
在对象创建之前 执行一些动作

  • 静态方法
    类似类方法
  1. @staticmethod
    加上可以不填self这个参数
  2. 静态方法无需传递参数(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)















posted @ 2021-08-21 13:19  guxuanyan  阅读(34)  评论(0)    收藏  举报