首页 > 代码库 > 重定向C库中stdio文件中的printf()函数,文件流-->串口USART1
重定向C库中stdio文件中的printf()函数,文件流-->串口USART1
6.4 一些说明
数据属性可以重写同名的方法属性。这是为了避免在大型系统中产生问题的意外名称冲突。所以用一些减少冲突的常用方法是很有效果的。常用的方法包括:大写字母方法名称,用唯一的字符串来做为数据属性的名称(可以是个下划线_)或者用动词命名方法和用名字命名数据属性。
数据属性就像和对象的普通用户一样可以被方法引用。换句话说,类不能用来实现纯净的数据类型。事实上,在python中不能强制数据隐藏,一切基于约定。(另一方面,如C中写的,python的实现可以做到完全隐藏实现细节并且在必要是可以控制对象的访问,这可以通过C语言扩展Python)
客户应该谨慎使用数据属性,客户可能会混淆通过方法来维护的常量。而践踏他们的数据属性。注意只要能避免重复,客户可以自己添加数据属性给对象实例,而不影响方法的合法性--再次,命名约定可以避免很多麻烦。
从方法内部引用数据属性(或者其他方法)是没有便捷方式的。 我发现这可以增加方法的可读性,当浏览一个方法时,不会轻易混淆局部变量和实例变量。
常常,方法的第一参数称为self。 这里除了约定在没有其他意思,名称self对python绝对没有特别的含义。但是,要注意,如果不遵守这种约定,你的代码可能对其他python程序员来说可读性很差。也可以理解,类浏览程序可能就是基于这种约定的写成的。
任何作为类属性的函数对象定义了一个该类实例的方法。在类定义中在书面上函数定义是封装的有时是没有必要的,也可以把一个函数对象赋值给在类中的局部变量。例如:
# Function defined outside the class
def f1(self, x, y):
return min(x, x+y)
class C:
f = f1
def g(self):
return ’hello world’
h = g
现在f,g和h 都是指向函数对象类C的所有属性,因此他们都是类C实例的所有方法--C其实和g是等价的。 需要注意的是,这个习惯只会让让程序的读者迷惑。
方法可以通过用方法属性self可以调用其他方法。
class Bag:
def __init__(self):
self.data = []
def add(self, x):
self.data.append(x)
def addtwice(self, x):
self.add(x)
self.add(x)
方法可以用和引用普通函数相同的方法使用全局名称。和方法相应的全局作用域是包含该方法定义的模块。(一个类从不能当做全局作用域来用)虽然在方法中使用全局变量很少有好的理由,但是全局作用域有很多合法的用处。首先,引入全局作用域的函数和模块可以当方法,如同定义在它里面的函数和类一样被使用。通常,包含方法的类在这个全局作用域中被定义。在接下来的一节,我们将会找到更加充分的理由来解释为什么方法可以引用它自己的类。