一. 类和实例
第一个面向对象程序:
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', 59) lisa = Student('Lisa Simpson', 87) bart.print_score() lisa.print_score()类名通常是大写开头的单词,(object) 表示该类从哪个类继承
__init__类似Java中的构造函数,对属性进行初始化;参数self表示创建的实例本身,调用的时候self不需要传,python解释器自己会把实例变量传进去。
二. 访问限制
类实例的变量名以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问
如果变量名以双下划线开头,并且以双下划线结尾(__xxx__),它是特殊变量,特殊变量是可以直接访问的,表示private变量
如果变量名以一个下划线开头(_xxx),这样的实例变量外部是可以访问的,但是按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是请把我看成私有变量,不要随意访问”
如何访问私有变量?和Java一样定义get、set方法:
class Student(object): def __init__(self, score): self.score = score def get_name(self): return self.__name def set_score(self, score): self.__score = score
三. 继承和多态
继承的好处:子类可以获取父类的全部功能,当然子类也可以重写父类的方法。
class Animal(object): def run(self): print 'Animal is running...' class Dog(Animal): def run(self): print 'Dog is running...' class Cat(Animal): def run(self): print 'Cat is running...' animal = Animal(); animal.run() # Animal is running... dog = Dog() dog.run() # Dog is running... cat = Cat() cat.run() # Cat is running...
多态:一个类的多种形态,比如:dog可以当成animal,cat也可以当成animal
class Animal(object): def run(self): print 'Animal is running...' def run_twice(self, animal): animal.run() class Dog(Animal): def run(self): print 'Dog is running...' class Cat(Animal): def run(self): print 'Cat is running...' animal = Animal() dog = Dog() cat = Cat() animal.run_twice(animal) # Animal is running... animal.run_twice(dog) # Dog is running... animal.run_twice(cat) # Cat is running...多态的好处:当我们需要传入Dog、cat的时候,我们只需要接受Animal类型就可以了,因为Dog、cat都是Animal类型,对于一个变量,我们只需要知道它是Animal类型,无需确切地知道它的子类型,就可以放心地调用run()方法,因此,传入的任意类型,只要是Animal类或者子类,都会自动调用实际类型的run()方法,这就是多态。
四. 获取对象信息
判断某个变量是否是某个类型可以用isinstance()
a = list() # a是list类型 b = Animal() # b是Animal类型 c = Dog() # c是Dog类型 print isinstance(a, list) # True print isinstance(b, Animal) # True print isinstance(c, Dog) # True
判断对象是什么类型:
import types type('abc')==types.StringType # True可以通过getattr(), setattr(), hasattr()来直接操作一个对象的状态:
操作对象的属性:
>>> hasattr(obj, 'x') # 有属性'x'吗? True >>> obj.x 9 >>> hasattr(obj, 'y') # 有属性'y'吗? False >>> setattr(obj, 'y', 19) # 设置一个属性'y' >>> hasattr(obj, 'y') # 有属性'y'吗? True >>> getattr(obj, 'y') # 获取属性'y' 19 >>> obj.y # 获取属性'y' 19操作对象的方法:
hasattr(obj, 'power') # 有属性'power'吗? getattr(obj, 'power') # 获取属性'power' fn = getattr(obj, 'power') # 获取属性'power'并赋值到变量fn, fn指向obj.power fn() # 调用fn()与调用obj.power()是一样的