Python学习——面向对象_类属性和类方法

根据B站 “黑马程序员” 的python教程记录笔记。 

在前面的学习中,我们已经知道:

使用面向对象开发,第一步是设计类

        使用 类名() 创建对象,而这个动作分为几步:

                1.在内存中为对象分配空间

                2.调用初始化方法 __init__ 为对象初始化

                3.对象创建后,内存 中就有了一个对象的 实实在在 的存在 --- 实例

因此,通常也会把:

        1.创建出来的 对象 叫做 的实例

        2.创建对象的 动作 叫做 实例化

        3.对象的属性 叫做 实例属性

        4.对象调用的方法 叫做 实例方法

在程序执行时:

1.对象各自拥有自己的 实例属性

2.调用对象方法,可以通过 self.

        访问自己的属性

        调用自己的方法

而这些都是类创建出来的对象(实例)的属性和方法,那我们反观类,提出一个问题:

        类是否也有属性和方法呢?

答案是,有。

接下来,我们就来了解一下类的属性和方法是什么,需要怎么定义以及怎么使用,在什么环境下使用。

一、类属性和类方法是什么

首先需要知道,类是一个特殊的对象。
在python中,一切皆对象:
        class AAA:定义的类属于 -> 类对象
        obj1 = AAA() 属于 -> 实例对象
在程序运行时,类同样会被加载到内存.
所以,在python中,是一个特殊的对象 --> 类对象
在程序运行时,类对象在内存中只有一份,使用一个类可以创建多个对象实例。
除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法:
        1.类属性         2.类方法

其中
1.类属性:
通常用来记录与这个类相关的特征
类属性不会用于记录具体对象的特征

2.类方法:
就是针对类对象定义的方法
在类方法内部可以直接访问类属性或者调用其它的类方法

        简单来说,类属性和类方法实例(对象)的属性和方法 相似,主要是这个属性和方法的所属不同。

二、如何定义和使用类属性和类方法

类属性语法:

        使用赋值语句定义类属性

        通过 类名.类属性 的方式对类属性进行修改

下面通过实例演练帮助理解:

# 实例需求:
# 1.定义一个工具类
# 2.每件工具都有自己的 name
# 3.需求 -- 知道使用这个类,创建了多少个工具对象
class Tool(object):
    # 使用赋值语句定义类属性,记录所有工具对象的数量
    count = 0

    def __init__(self, name):
        self.name = name
        # 让类属性的值+1
        Tool.count += 1


# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("榔头")
tool3 = Tool("水桶")

# 输出工具对象的总数
print("一共有 %s 个工具" % Tool.count)
print("一共有 %s 个工具" % tool1.count)

运行结果:

 看到这里可能会有一个疑问:

        在最后输出的时候,Tool.count 表示输出 Tool 这个类的 count 属性,那么 tool1.count 又代表什么呢?

 这时候就需要讲到属性的获取机制

属性的获取机制 -- 向上查找机制 -- (tool1.count) -- 先在对象内部查找对象属性, 没有找到就会向上寻找类属性
因此, 要访问类属性有两种方式:
        1.对象.类属性(不推荐)
        2.类名.类属性

        由于会先在对象内部查找对象属性,因此,当类和(这个类的)对象有一个同名属性时,会调用对象的属性,这时调用出来的与我们所需要的类属性不一样,易造成错误和混乱。故不推荐对象.类属性 的方式调用类属性。

另外,在上述代码的下面添加几行代码,看看运行结果:

print("-" * 10)
# 注意: 如果使用 对象.类属性 = 值 赋值语句,只会给对象添加一个属性,而不会影响到 类属性的值
tool2.count = 99
print("此时输出的是类属性的count -- %s" % tool1.count)
print("此时输出的是新创建对象的属性 -- %s" % tool2.count)

由此可以知道:

在使用 对象.类属性 = 值 赋值语句的时候,只会为该对象添加属性,而不会影响到类属性的值。所以在使用类属性的时候,建议统一用 类名.类属性 = 值/表达式 的方法来对类属性进行定义或修改。

类方法语法:

       1.用以下语句进行类方法的定义

        @classmethod 

        def 类方法名(cls):

                pass

        2.用以下方法进行调用:

        通过 类名. 调用 类方法

        调用方法时,不需要传递cls参数 -- 类似self

        在方法内部:可以通过 cls. 访问类的属性

        也可以通过 cls. 调用其他的类方法

都类似于对象方法中利用 self. 来进行对象属性的访问和对象方法的调用

 下面通过实例演练帮助理解:

# 实例需求:
# 1.定义一个工具类
# 2.每件工具都有自己的 name
# 3.需求 -- 在 类 封装一个 show_tool_count 的类方法,输出使用当前这个类,创建的对象个数
class Tool(object):
    count = 0

    @classmethod
    def show_tool_count(cls):
        """显示工具对象的总数"""
        print("工具对象的总数 %d" % cls.count)

    def __init__(self, name):
        self.name = name
        Tool.count += 1


# 创建工具对象
tool1 = Tool("斧头")
tool2 = Tool("锄头")
tool3 = Tool("水桶")
# 调用类方法
Tool.show_tool_count()

运行结果:

 

三、在什么环境下使用

说了这么多,那么应该在什么环境下使用类属性和类方法呢?

其实早在第一部分就已经解答。

使用场景通常与其定义有关系,那我们来看看类属性的定义:

        通常用来记录与这个类相关的特征

        类属性不会用于记录具体对象的特征

即 该类所有对象都具有的相同的特征 可以用类属性进行记录

也可以像在实例演练中那样,充当计数的作用

另外可能有个疑问,既然用来记录对象的共同特征,那为什么不定义在对象属性上呢。

这就能看出类属性的一个优点了:

  • 实例属性要求每个对象为其单独开辟一份内存空间来记录数据,而类属性为全类所共有,仅占用一份内存,更加节省内存空间
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值