【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充

文章目录

  • C9符合Python风格的对象
    • 9.1 对象表示形式
        • 自测
        • 答案
    • 9.4  classmethod 与 staticmethod
        • 自测
        • 答案
    • 9.6 可散列的 Vector2d
        • 自测
        • 答案
    • 9.7 Python的私有属性和“受保护的”属性
        • 自测
        • 答案
    • 9.8 使用 __slots__ 类属性节省空间
        • 自测
        • 答案
    • 9.9 覆盖类属性
        • 自测
        • 答案

C9符合Python风格的对象

9.1 对象表示形式

自测

1. 当类实现了__bytes__ 和 format,它们分别会在什么情况下被调用?

答案

1.
__bytes__:在print和bytes(对象时), 这就像我在第一章所说的__str__
__format__:在内置的 format() 函数和 str.format() 方法调用

9.4  classmethod 与 staticmethod

自测

1. classmethod的作用?
2. 什么时候使用staticmethod ?

答案

1. classmethod 改变了调用方法的方式,因此类方法的第一个参数是类本身,而不是实例。
classmethod 最常见的用途是定义备选构造方法.

2.
不是必须要使用的,因为它就是一个与模块无关的普通函数,而这个方法的功能紧密相关,因此就想把它放在近处。但其实放在同一模块中的类前面或后面定义函数也可以。
如下图,注意这个方法的交互式输出,这说明它的确是一个普通的函数。
【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充_第1张图片
【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充_第2张图片

9.6 可散列的 Vector2d

自测

1. 怎样将自定义的类的实例变为可散列的?
2. 定义 intfloat 方法作用?

答案

1.
实现__hash____eq__

实现__hash__ 这个应该返回一个整数,根据特殊方法 __hash__的文档,最好使用位运算符异或( ^ )混合各分量的散列值
在这里插入图片描述
除此之外,应该让实现__eq__方法,让相等的对象应该具有相同的散列值。

2.
分别被 int() 和float() 构造函数调用),以便在某些情况下用于强制转换类型。

9.7 Python的私有属性和“受保护的”属性

自测

1. 设置私有属性作用?
2. 都知道python其实不存在私有属性(这里我指的是前面两个下划线),是因为它是给原属性改了什么名?

答案

1.
可从两个角度来看待
对创建实例的那个类而言,这样可以不让信息泄露出去。
对于它的子类而言,这避免了父类实例被覆盖掉。

2.
【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充_第3张图片

9.8 使用 slots 类属性节省空间

自测

1. slots 类属性解决了什么问题,它是通过什么方式解决的?
2. 众所周知属性能被继承故有了前文的私有属性,那__slots__ 类属性能否被继承?
3. __slots__副作用?

答案

1.
【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充_第4张图片
【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充_第5张图片
2.
不能被继承。

3.【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充_第6张图片
【流畅的python】笔记(C9符合Python风格的对象)自测知识点和书籍补充_第7张图片

9.9 覆盖类属性

自测

1. 可以通过修改实例来修改类属性吗?

答案

1.
不可以,只能在类上修改。

你可能感兴趣的:(python进阶学习,python)