像C++一样,class语句是Python的主要面向对象编程工具,与C++不同的是,Python的class不仅是一个说明,像def一样,class是一个对象建造者,是一个隐含的赋值(运行时它产生了一个类对象,并用列在首部的类名字来引用这个对象)。
- 类的定义
- 通过继承来定制类
- 类可以重载Python的操作符
类的定义:
class FirstClass():
def setdata(self, value):
self.data = value
def display(self):
print(self.data)
类定义的格式如上所示,类中包含方法的定义。Python语言,一定要对齐,注意格式的规范。类的实例如下:
x = FirstClass()
y = FirstClass()
x.setdata("king")
x.display();
y.setdata(90);
y.display();
king
90
通过继承来定制类
类继承的思想是:
- 超类列在类首部的括号里;
被继承的类为超类(superclass)。
- 类从超类继承属性;
- 实例从所有相关类中继承;
当查找一个名字时,Python先在实例中找,然后是它的类,最后是超类。
- 通过子类改变逻辑,而不是直接改变超类;
通过在子类里覆盖超类里的名字,子类就覆盖了继承的行为。
class SecondClass(FirstClass):
def display(self):
print('current value = "%s"' %self.data)
z = SecondClass();
z.setdata(43)
z.display();
current value = "43"
类可以重载Python的操作符:
- _ _X_ _的名字的方法是特殊的挂钩(hook);
Python通过特殊命名的方法拦截操作符,以实现操作符重载。
- Python在计算操作符时会自动调用这样的方法;
- 类可以冲定义大多数内置的操作符;
- 操作符重载似的类与Python的对象模型紧密集成;
class ThirdClass(SecondClass):
def __init__(self,value):
self.data = value
def __add__(self,other):
return ThirdClass(self.data + other)
def __mul__(self, other):
self.data = self.data * other
a = ThirdClass("abc")
a.display()
b = a + 'xyz'
b.display()
a*3
a.display()
current value = "abc"
current value = "abcxyz"
current value = "abcabcabc"
Python和面向对象编程:
继承:在Python里是基于属性查找;
多态:对于X.method来说,method方法的含义依赖于X的类型;
封装:方法和操作符实现了行为,而数据隐藏是一种约定;
名字空间规则总结
限定型名字(object.x)和非限定型名字是不同的:
非限定型名字与作用域有关;
限定型名字使用对象object的名字空间;
(在模块与类的)作用域内初始化对象的名字空间;
名字空间字典:
面向对象编程和授权:
授权指的是内嵌有其他对象的控制对象,它们向内嵌对象传递响应操作请求,控制对象负责跟踪访问这样的事物。Python里授权经常是用 __gerattr__方法来实现,因为它拦截了对不存在属性的访问,一个包裹类可以用__gerattr__把请求转向被包裹的类。