• 从零开始学Python第七周:面向对象进阶(需修改)


    一,类的属性

    (1)示例

    • 通过属性获取已经创建对象的个数

       class Plane:
           pCount = 0     #类属性
           def __init__(self,name,category):
               self.name = name
               self.category = category      #实例属性
               Plane.pCount += 1
           
       print ('已生产,Plane.pCount,'架飞机')
       p1 = Plane('平安','播音777')
       print ('已生产',PlanepCount,'架飞机')   #输出属性
       print ('已生产',p1.pCount,'架飞机')
       p1.pCount += 1                          #变更实例属性值
       print('已生产',p1.pCount,'架飞机')
       print('已生产',Plane.pCount,'架飞机')
      

    (2)属性

    • 类属性
      @与类绑定,不依赖于对象,又称为静态属性
      @不需要实例化对象
      @类和其对象都可以访问获取其值

    • 实例属性
      @存在于对象中
      @必须先创建对象,再访问获取其值
      @每一个不同的对象都有属于自己的实例属性值
      1.png-7.8kB

    当通过对象访问某个属性时,解释器会先尝试在实例命名空间中寻找。如果找不到,就会去类属性中查找

    (3)类属性

    • 在类体中声明,并初始化

    • 访问方式
      @类名.属性
      @对象名.属性

       class Plane:
           pCount = 0     #声明pCount,并赋初值
           def __init__(self):
               Plane.pCount += 1   #新创建1个对象,其值自增1
       print ('已生产,Plane.pCount,'架飞机')
       p1 = Plane()
       print ('已生产',PlanepCount,'架飞机')   #通过类名获得值
       print ('已生产',p1.pCount,'架飞机')
      

    类属性属于类自身,对象仅在没有同名实例属性时才能访问它
    类和对象都可以访问类属性,但对象只能读取、不能修改类属性的值
    当试图通过对象给类属性赋值时,解释器会理解为:给对象p1的pCount属性赋值
    如果对象p1没有pCount属性,会自动的给对象p1创建一个与类属性同名的实例属性
    因此,p1.pCount属性与Plane.pCount不是同一属性

    (4)实例属性

    • 多种声明方式

    @_init _()声明,并初始化
    @通过赋值语句声明,并赋值
    2.png-107.5kB

    • 对象可以访问类属性,但类不能访问实例属性
      3.png-63.6kB
      (5)获得类属性信息
    • 内置函数
      @dir():返回类属性列表
    • 类的字典属性__dict_ _:返回一个字典
      @键是属性名
      @值是相应的属性对象的数据值
      4.png-47.9kB
      (6)特殊的类属性
    • 每个类都具有内置属性
    • 使用点运算符“.”可以访问
    • 常用的类属性
      1.png-72.1kB
      (7)特殊的实例属性
    • 常用的内置函数
      2.png-81.1kB
      3.png-40.6kB

    二,类的方法

    (1)示例

    • 程序中有多条相同的输出语句,代码重复
      1.png-68.8kB

    • 可否提取形成一个新的方法,且调用方法时不依赖类的对象?
      (2)方法

    • 实例方法:

    (self,参数列表)

    @与类绑定,依赖对象
    @在类中声明定义
    @必须先创建对象,再调用执行
    @类对象可以调用执行

    • 类方法:

    @classmethod
    类方法(cls,参数列表)

    • 静态方法

    @与类方法相似

    @staticmethod
    静态方法名(参数列表)

    1.png-12.4kB

    (3)类方法

    • 语法
    • 通过装饰器“@classmethod”通知解释器是类方法
    • 第1个参数cls表示当前类
    • cls是隐含参数,调用方法时不需传入实参
      (4)示例1
    • 抽取输出代码形成一个类方法
      1.png-83kB
      (5)静态方法
    • 语法

    @staticmethod
    静态方法名(参数列表)

    • 通过装饰器“@staticmethod”通知解释器是静态方法
    • 没有隐含参数
      (6)示例2
    • 抽取输出代码形成一个静态方法
      1.png-79.9kB
      (7)类方法与静态方法比较
    • 相同点
      @与类绑定,不依赖于对象
      @不需实例化对象
      @类和其对象都可以调用执行
    • 不同点
      1.png-42.6kB

    **三,类的特殊成员 **

    我们都知道类名后边加圆括号调用的是类的init方法:如下

    1.png-28.5kB

    那么,对象后边加括号调用的是什么方法呢?

    (1)__call__方法
    2.png-17.8kB

    (2)__str__方法

    我们知道当对象实例化以后,通过对象加“.”来调用类的实例属性,那么直接输出对象的话是什么值呢?

    3.png-20.9kB

    一串地址看着太费劲,也看不出来啥东西,一点意义也没有,那么能不能换成别的呢?

    4.png-27.4kB

    image_1b3934r4q2jq1vki160a17621lst1p.png-39.1kB
    (3)__getitem__方法

    我们明白了小括号对对象的作用以后,那么我们想一个问题,以前咱们学过的字典取值和列表取值等,列表的名字其实都是一个个的对象,那么后边的中括号又是做什么用的呢?对象+[]又是调用的什么方法呢?
    1.png-23.6kB
    我们应该还记得列表还有一种切片取值的方法,那么这个是怎么实现呢?
    image_1b394fggt1gmo1u8ire41lu1tum2u.png-24.8kB
    (4)__setitem__方法
    我们明白了字典列表取值是调用的getitem方法,那么赋值呢?

    1.png-31.7kB

    (5)__delitem__方法
    我们记得字典有一个del+对象【】的删除的方式,这个是怎么实现的呢?
    image_1b394k4q6vuo83e9jfb8c1bdr3b.png-38.8kB

    北京IT职业教育培训中心,欢迎来校咨询。微信号:yinsendemogui(添加时请注明博客园)
  • 相关阅读:
    高阶 CSS 技巧在复杂动效中的应用
    CSS 渐变锯齿消失术
    现代 CSS 指南 atrule 规则扫盲
    有意思的水平横向溢出滚动
    Windows内核逆向【目录】
    七、回调
    UOS隐藏分区方法
    fluentd 配置文件中label的作用是什么?
    什么是fluentd event ? fluentd event是由哪几个部分构成的?
    如何查看fluentd中都安装了哪些的插件?
  • 原文地址:https://www.cnblogs.com/chensiqiqi/p/6136122.html
Copyright © 2020-2023  润新知