python学习笔记(六) - 面向对象编程

一. 类和实例

第一个面向对象程序:

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()是一样的

你可能感兴趣的:(python学习笔记(六) - 面向对象编程)