如果采用面向对象的程序设计思想,我们首选思考的不是程序的执行流程,而是Student这种数据类型被视为一个对象。
这个对象拥有name和score这两个属性(Property)。
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print '%s: %s' % (self.name, self.score)
a=Student('a','b')
print a
print type(a)
print a.print_score()
class Student(object):
pass
class 后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),
表示该类从哪个类继承下来的,如果没有合适的继承类,就使用object类
注意到__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身
数据封装:
面向对象编程的一个重要特点就是数据封装,
访问限制:
在class内部,可以有属性和方法,而外部代码可以通过直接调用变量的方法来操作数据,
但是,从前面Student的定义来看,外部代码还是可以自由地修改一个实例的name,score属性
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print '%s: %s' % (self.name, self.score)
bart = Student('Bart Simpson', 98)
print bart
print bart.name
print bart.score
bart.score = 59
print bart.score
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a19.py
<__main__.Student object at 0x02556350>
Bart Simpson
98
59
如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__.
在Python中,实例的变量如果以__开头,就变成了一个私有变量,只有内部可以访问,外部不能访问。
继承和多态:
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
当我么需要编写Dog和Cat类时,就可以直接从Animal类继承:
class Animal(object):
def run(self):
print 'Animal is running...'
class Dog(Animal):
pass
a=Dog()
print a
print type(a)
print a.run()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a19.py
<__main__.Dog object at 0x02587E30>
<class '__main__.Dog'>
Animal is running...
None
对于Dog来说,Animal就是它的父类,对于Animal来说,Dog就是它的子类。Cat和Dog类似。
class Animal(object):
def run(self):
print 'Animal is running...'
class Dog(Animal):
def run(self):
print 'Dog is running...'
a=Dog()
print a
print type(a)
print a.run()
C:Python27python.exe C:/Users/TLCB/PycharmProjects/untitled/mycompany/cookbook/a19.py
<__main__.Dog object at 0x02646310>
<class '__main__.Dog'>
Dog is running...
None
当子类和父类都存在相同的run()方法时,我们说,子类run()覆盖了父类的run()
要理解什么是多态,我们首先要对数据类型再作一点说明,当
我们定义一个class的时候,我们实际上就定义了一种数据类型。
我们定义的数据类型和Python自带的数据类型没什么两样: