Python3.x那些事儿:[69]python类杂谈

2024-11-07 07:26:59

数据属性会覆盖方法属性,如果名字相同的话。为了避免名字上的冲突,应该遵守一些约定俗成的规矩。比如一些简单的规则类似于方法名称大写,在数据属性名字前面加上一个唯一的前缀如一个下划线,方法名用动词,属性名用名词等等。

数据属性可以被方法引用,也可以被对象的使用者引用。换句话说,类是无法用来实现单纯的抽象的数据类型的。实际上,python中的任何东西都无法强制进行数据隐藏,所有的隐藏都是基于规则来实现的。另一方面,python本身的实现是用C语言,因此是可以完全实现数据的隐藏和访问控制的,这种方法可以用python的扩展中使用。

用户应该要小心使用对象的数据属性。客户会通过给数据属性加标记混淆方法维护的一些不变量。注意,客户可以往一个对象实例中添加一个自己的属性并不会应用方法的有效性,只要它们的名字没有发生冲突就行。

在方法内部引用属性或者其他方法没有便捷渠道。这样增加了方法的可读性,因为从方法的内部来看,本地变量和实例变量发生冲突是不可能的。

通常一个方法的第一个参数为self,这是一个规则而不是强制的,self没有任何特殊的含义,你也可以把它取做其他名字。但是如果你不遵守这种规则,那么你缩写的程序对于其他python程序员来说可读性就非常差,而且一些类浏览器可能会依据这些规则来进行设计。

一个类中的任何函数对象对会在类的实例中对应一个方法对象。函数对象不一定非要在类的内部进行定义,也可以是将一个定义好的函数对象赋值给类的变量。例如:

Python3.x那些事儿:[69]python类杂谈

现在,f1,g,h都是类C的属性并且都指向了函数对象,因此它们都是类C的实例中的方法,h和g是完全一样的。

在方法内部可以通过使用self来使用其他方法。

Python3.x那些事儿:[69]python类杂谈

方法可以引用全局变量,和其他函数对象没什么区别。对于方法来说,全局就是定义它的模块。类是不能作为全局的。我们通常都很少遇到要使用全局变量的场景。这里有几个使用全局变量的合法场景:一个是,被import进全局的函数和模块可以被方法引用。实际上,方法所在的类的定义就是在全局中。每一个值都是一个对象,因此都有一个类与之对应,这个类就是存储在object.__class__中

猜你喜欢