【笔记2】 面向对象在Python中的实践

本文详细介绍了Python中的面向对象编程,包括如何定义类、创建对象,以及对象属性和类属性的增删改查操作。重点讨论了属性与变量的区别、属性的访问权限以及如何通过`__init__`方法初始化对象属性。同时,提到了`__slots__`特性用于限制对象可添加的属性,并通过案例展示了类属性和对象属性的共享特性。
摘要由CSDN通过智能技术生成

面向对象在Python中的实践

如何定义一个类?

【基本语法】

class 类名:                   
    pass   
class Money:
    pass    

类名首字母大写,后不用跟小括号;pass:空语句

​ #经典类

​ #新式类

怎样通过类,创建出一个对象?

根据类Money 创建(实例化)一个对象Money()

  • one = Money()

    把对象赋值给变量,此时one是对象

  • Money既是一个变量名称;也是类的名称。

  • 在这里插入图片描述

执行流程

  1. 类的定义

  2. 根据类,创建出一个对象

  3. 将对象的唯一标识返回

属性相关

属性和变量的区别及判定依据?

  • 区别

    • 概念

      • 变量是“可以改变的量值”
      • 属性是“属于某个对象的特性”(也可以改)
    • 访问权限

      • 变量:根据不同的位置,存在不同的访问权限 eg:全局变量、局部变量…

      • 属性:只能通过对象来进行访问,所以,必须先找到对象;
        对象也是通过变量名来引用;而既然是变量,也有对应的访问权限

  • 判定依据:是否存在宿主

    变量可以直接写,对象的属性要是"对象.属性"。

根据宿主的不同,属性分为两大类:

  1. 对象属性 p = Money()

    • 怎样让一个对象拥有一些属性?(增)

      • 直接通过对象,动态添加

        语法: 对象.属性 = 值 p.age = 18

      • 通过类的初始化方法(构造方法)

        __init__方法

      • 在这里插入图片描述

    • 怎样访问一个对象的属性?(查)

      • 一般访问: 对象.属性 print(p.age)
      • 如果访问不到 会直接报错-----需要记住错误提示 AttributeError
    • 怎样修改一个对象的属性?(改)

      • 同新增一样;系统会自动识别,不存在则新增,存在则修改

      • 语法:对象.属性 = 值 p.age = 123

      • 在这里插入图片描述

        age、height真正存储位置在对象里的dict属性里(后面类属性部分)。

    • 怎样删除一个对象的属性?(删)

      • del 对象.属性 del p.age
    • 补充

      • 查看对象的所有属性: 对象._dict_
  2. 类属性

    • 万物皆对象,类也是一个对象

      one = Money

      one._class_=Test # 更改one的类

    • 怎样让一个类拥有属性?(增)

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

      • 方式2: 类里面写“变量名 = 值”即可

        class Dog:
        dogCount = 0

    • 怎样查询一个类的属性?(查)

      1. 通过类访问: 类名.类属性

      2. 通过对象访问: 对象.类属性

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

    • 怎样修改一个类的属性?(改)

      • 通过类名改:语法如同给类增加一个属性(方式1)系统也会自动检测,不存在,则新增;存在,则修改。 类名.属性 = 值
      • 能否通过对象改?----不能!
    • 怎样删除一个类的属性?(删)

      • 通过类名删除:del 类名.属性
      • 能否通过对象删除? 不能! del 语句只删除直系属性。
    • 注意1:类属性的内存存储问题。

      • 一般情况下,属性存储在__dict__的字典当中。通过变量访问的属性访问的就是对象里面dict属性里字典的值。

        在这里插入图片描述

        但有些内置对象没有这个__dict__属性。

      • 一般对象可以直接修改__dict__属性

      • 但类对象的__dict__属性为只读,默认无法修改;

        ​ 可以通过setattr方法修改

    • 注意2:类属性被各个对象共享 ---- 类属性修改之后,所有的对象访问到的类属性都会跟着修改。

    • (补充)查看一个类的所有属性:类名._dict_

  3. 对象属性和类属性之间的区别联系?

    存储不同、抽象层级不同、宿主不同

    • 案例考察


      1. class Person:
        count = 1

      2. 对象 p = Person()

      3. p.count += 1 代码执行之后,Person.count 与 p.count 打印的结果分别是多少?

        Person.count=1; p.count=2

        p.count += 1 ==> p.count[新增] = p.count[查询] +1

        ?为什么第一个是新增不是修改:判定新增还是修改判断依据是原来对象里有没有,之前对象p内没有所以是新增。

  4. 高级----如何限制对象添加的属性?

    • 通过设置类属性:__slots__
    • __slots__属性是一个列表
      • 列表中的元素,即为通过这个类创建出的对象可以添加的对象属性
      • 如果这个类实例出的对象,添加了非列表之内的属性,则会报错
      • 在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值