【Python面向对象编程】第03篇 类变量

本篇我们学习类变量(类属性)的概念和原理。

类变量简介

Python 中的一切皆对象,包括类。也就是说,Python 类也是一个对象。

当我们使用 class 关键字定义类时,Python 会创建一个对象,对象名称就是该类的名称。例如:

class HtmlDocument:
   pass

以上示例定义了 HtmlDocument 类以及 HtmlDocument 对象。HtmlDocument 对象拥有 __name__ 属性:

print(HtmlDocument.__name__)
HtmlDocument

同时,HTMLDocument 的类型为 type:

print(type(HtmlDocument))
<class 'type'>

他是 type 类的一个实例:

print(isinstance(HtmlDocument, type))
True

类变量和类相关联,它们被该类的所有实例共享。以下示例为 HtmlDocument 类增加了两个类变量 extension 和 version:

class HtmlDocument:
    extension = 'html'
    version = '5'

extension 和 version 都是 HtmlDocument 类的变量,它们和 HtmlDocument 类相关联。

获取类变量的值

如果想要获取类变量的值,可以使用点号表示法(.)。例如:

print(HtmlDocument.extension) # html
print(HtmlDocument.version) # 5

如果访问的类变量不存在,Python 将会返回一个 AttributeError 异常。例如:

HtmlDocument.media_type
AttributeError: type object 'HtmlDocument' has no attribute 'media_type'

获取类变量值的另一个方法就是使用 getattr() 函数。该函数接受一个对象和变量名作为参数,返回对应类变量的值。例如:

extension = getattr(HtmlDocument, 'extension')
version = getattr(HtmlDocument, 'version')

print(extension)  # html
print(version)  # 5

如果访问的类变量不存在,同样会返回一个 AttributeError 异常。为了避免这个异常,我们可以为 getattr() 函数指定一个默认的返回值。例如:

media_type = getattr(HtmlDocument, 'media_type', 'text/html')
print(media_type)
text/html

设置类变量的值

如果想要设置类变量的值,同样可以使用点号表示法:

HtmlDocument.version = 10

或者也可以使用内置的 setattr() 函数:

setattr(HtmlDocument, 'version', 10)

Python 是一种动态编程语言,我们可以在运行时为类增加变量。例如,以下示例为 HtmlDocument 类增加了一个类变量 media_type:

HtmlDocument.media_type = 'text/html'
print(HtmlDocument.media_type)

同样,我们也可以使用 setattr() 函数:

setattr(HtmlDocument, media_type, 'text/html')
print(HtmlDocument.media_type)

删除类变量

如果想要在运行时删除类变量,可以使用 delattr() 函数:

delattr(HtmlDocument, 'version')

或者也可以使用 del 关键字:

del HtmlDocument.version

类变量的存储

Python 将类变量存储在 __dict__ 属性中。__dict__ 是一个映射代理,也就是字典。例如:

from pprint import pprint


class HtmlDocument:
    extension = 'html'
    version = '5'


HtmlDocument.media_type = 'text/html'

pprint(HtmlDocument.__dict__)

输出结果如下:

mappingproxy({'__dict__': <attribute '__dict__' of 'HtmlDocument' objects>,
              '__doc__': None,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'HtmlDocument' objects>,
              'extension': 'html',
              'media_type': 'text/html',
              'version': '5'})

从输出结果可以看出,除了其他预定义的类变量之外,__dict__ 还包含了三个类变量:extension、media_type 以及 version。

Python 不允许直接修改 __dict__。例如,以下代码返回了一个错误:

HtmlDocument.__dict__['released'] = 2008
TypeError: 'mappingproxy' object does not support item assignment

尽管如此,我们可以使用 setattr() 函数或者点号表示法间接修改 __dict__ 属性。

另外,__dict__ 的键都是字符串,可以帮助 Python 提高变量的查找速度。

虽然 Python 允许通过 __dict__ 字典访问类变量,但是不推荐这样做。而且某些情况下无法通过该字典访问变量,例如:

print(HtmlDocument.__dict__['type']) # BAD CODE

可调用的类属性

类属性可以是任何对象,包括函数。

当我们为类增加一个函数时,函数就成为了一个类属性。由于函数可以被调用,因此这种类属性也被称为可调用的类属性。例如:

from pprint import pprint


class HtmlDocument:
    extension = 'html'
    version = '5'

    def render():
        print('Rendering the Html doc...')


pprint(HtmlDocument.__dict__)

输出结果如下:

mappingproxy({'__dict__': <attribute '__dict__' of 'HtmlDocument' objects>,
              '__doc__': None,
              '__module__': '__main__',
              '__weakref__': <attribute '__weakref__' of 'HtmlDocument' objects>,
              'extension': 'html',
              'render': <function HtmlDocument.render at 0x0000025302446B90>,
              'version': '5'})

以上示例中,render 是 HtmlDocument 类的一个类属性,它的值是一个函数。

总结

  • Python 类是一种对象,也是 type 类的一个实例。
  • 类变量是类对象的属性。
  • 使用点号表示法或者 getattr() 函数获取类变量的值。
  • 使用点号表示法或者 setattr() 函数设置类变量的值。
  • Python 是一种动态编程语言,我们可以在运行时增加类变量。
  • Python 类变量存储在 __dict__ 属性中,该属性是一个字典。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不剪发的Tony老师

为 5 个 C 币而折腰。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值