一. 类和实例
第一个面向对象程序:
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()是一样的