内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Python指南:高级程序设计之面向对象程序设计进阶

2018-07-11 18:15 出处:清屏网 人气: 评论(0

本节中,我们将更深入地学习 Python 对面向对象的支持,学习很多可以减少必须编写的代码的总量、拓展程序的威力与功能的技术。下面以一个简单的类开始:

# 简单类定义
class Point:
    __slots__ = ("x", "y")
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

__slots__ 限制了 Point 能添加的属性只有 xy 。下面测试一下:

pt = Point()
pt.x = 1
pt.y = 2
pt.z = 3

[out]
Traceback (most recent call last):

  File "<ipython-input-1-88952c59b8ad>", line 11, in <module>
    pt.z = 3

AttributeError: 'Point' object has no attribute 'z'

可以看出不能给 pt 中没有定义的属性赋值,下面去掉 __slots__ 所在行:

class Point2:
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

pt = Point2()
pt.x = 1
pt.y = 2
pt.z = 3

上面这段程序可以正常运行。

1、 控制属性存取

Python中定义了一些用于属性存取的特殊方法:

方法名称 使用 描述
__delattr__(self, name) del x.n 删除对象x的属性
__dir__(self) dir(x) 返回x的属性名列表
__getattr__(self, name) v = x.n 返回对象x的n属性值
__getattribute__(self, name) v = x.n 返回对象x的n属性值
__setattr__(self, name) x.n = v 将对象x的n属性名值设为v

__getattr____getattribute__ 的主要区别:

  1. __getattrobute__() 只要涉及到实例属性的访问就会调用该方法,如果属性不存在会抛出 AttributeError 异常。

  2. __getattr__() 在以下情况下调用:

    • 属性不在实例的 __dict__ 中;
    • 属性不在其基类以及祖先类的 __dict__ 中;
    • 出发 AttributeError 异常时(不仅仅是 __get_attribute__() 引发的异常,property中定义的 get() 方法抛出的异常也会调用该方法。
  3. __getattr____getattribute__ 同时被定义时,要么显示在 __getattribute__ 中调用,要么抛出 AttributeError 异常,否则 __getattr__ 永远不会被调用。

下面定义了一个简单的 “常数” 类,可以正常的设置任意属性,但如果想要去改变或者删除该属性,则会产生异常。

class Const:
    def __setattr__(self, name, value):
        if name in self.__dict__:
            raise ValueError("cannot change a const attribute")
        self.__dict__[name] = value

    def __delattr__(self, name):
        if name in self.__dict__:
            raise ValueError("cannot delete a const attribute")
        raise AttributeError("'{0}' object has no attribute '{1}'"
                             .format(self.__class__.__name__, name))

测试1:

```python

尝试改变属性

const = Const()

const.limit = 51

const.limit = 20

[out]

Traceback (most recent call last):

分享给小伙伴们:
本文标签: Python程序设计

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号