面向对象在Python中的实践

对象属性

Money既是类名,也是变量名

根据类创建实例

 

增加对象属性(增)

直接通过对象,动态添加
        语法:
        对象.属性 = 值

  

访问对象属性(查)

dic可以打出当前对象的所有属性

修改对象属性(改)

删除对象属性(删)

类属性

增加类属性

方式1:类名.类属性 = 值

 方式2
    class Dog:
    dogCount = 0

查询类属性

 注意:
    为什么可以通过对象访问到类属性?
    答:和Python对象的属性查找机制有关
        优先到对象自身去查找属性,找到则结束
        如果没有找到,则根据__class__找到对象对应的类,到这个类里面查找

 改变对象的类

 

修改类属性

通过类名改
    语法如同给类增加一个属性的方式1
        系统也会自动检测
        不存在,则新增
        存在,则修改
        类名.属性 = 值

不能通过对象修改类的属性 

删除类属性

通过类名删除
    del 类名.属性

 不能通过对象删除类的属性,del语句只删除直系属性

 类属性的内存存储问题

    一般情况下,属性存储在__dict__的字典当中,有些内置对象没有这个__dict__属性
    一般对象可以直接修改__dict__属性
  

 

  但类对象的__dict__为只读;默认无法修改,可以通过setattr方法修改

 类属性被各个对象所共享

类属性和对象属性对比 

限制对象属性

通过设置类属性:__slots__

这个属性是一个列表
    列表中的元素,即为通过这个类创建出的对象可以添加的对象属性
    如果这个类实例出的对象,添加了非列表之内的属性,则会报错

方法相关

方法的概念

描述一个目标的行为动作
    比如描述一个人怎样吃,怎样喝,怎样玩...

和函数非常类似
    都封装了一系列行为动作
    都可以被调用的之后,执行一系列行为动作
    最主要的区别就是:调用方式

方法的划分 

实例方法

默认第一个参数需要接受到一个实例

class Person:
    def run(self):
        pass

   

  

类方法

默认第一个参数需要接收到一个类

还可通过实例来调用类方法

 

 延伸类调用类方法

静态方法

第一个参数啥也不默认接收

既可以通过类来调用,也可以通过实例来调用

注意

1. 划分的依据是:方法的第一个参数必须要接收的数据类型

 

 2. 不管是哪一种类型的方法,都是存储在类当中;没有在实例当中的

在Python中,万物皆对象,函数本质也是属于对象

 3. 不同类型方法的调用方式不同, 但,不管怎么调,把握一个原则
    不管是自己传递,还是解释器帮我们处理;最终要保证不同类型的方法第一个参数接收到的数据,是他们想要的类型

实例方法

 

 

类方法

 延伸类

静态方法 

不同类型的方法访问不同类型属性的权限问题

实例方法, 既可以访问类属性,也可以访问实例属性

类方法, 只能访问类属性,不能访问实例属性

静态方法, 直接访问类属性,无法访问实例属性

类相关补充 

元类

 

 类对象的创建方式

类对象创建时,元类的查找机制 

 

类的描述 (注释)

 注释文档的生成

 

 

属性相关补充

公有属性 

 

受保护属性

类内部访问

子类内部访问 

 模块内其他位置访问

 跨模块访问

import形式导入

from module import * 形式导入
    有__all__指明对应变量


    没有__all__指明对应变量

私有属性

 类内部访问

子类内部无法访问

模块内其他位置通通访问不了 

 跨模块访问
    参照单下划线开头变量的访问原则

私有属性的应用场景

 

只读属性

方案一

 只可读取,不能设置

property 使用方式

方案二

内置特殊属性

 

方法相关补充

私有化方法

内置特殊方法 

信息格式化操作

调用操作

 

索引操作

切片操作

比较操作

如果对于反向操作的比较符, 只定义了其中一个方法
但使用的是另外一种比较运算
那么, 解释器会采用调换参数的方式进行调用该方法
    例如
        定义了 "小于" 操作
            x < y
        使用 x > y
            会被调换参数, 调用上面的 "小于操作" 

但是, 不支持叠加操作
    例如
        定义了 "小于" 和 "等于" 操作
        不能使用 x <= y

上下文布尔值 

遍历操作

实现__getitem__方法
    优先级低
    每次for in 获取数据时, 都会调用这个方法

实现__iter__方法
    优先级高
    这个方法, 必须返回一个"迭代器"; 
即, 具备"__iter__"和"__next__"方法
    当for in 遍历这个对象时, 会调用这个__iter__方法返回的迭代器对象的__next__方法

  迭代器的复用

  

 可迭代的判定依据

iter函数的使用

 

描述器

描述器定义方式1 

描述器定义方式2

 调用细节

一般使用类产生的实例来操作描述器

资料描述器和实例属性优先级

 实例属性和非资料描述器优先级

 

数据存储问题 

装饰器 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值