面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。数据封装、继承和多态是面向对象的三大特点。
类和实例的关系:
类是抽象的模板,而实例是根据类创建出来的一个个具体的“对象”。
e.g.
class Student(object):
#类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。
def __init__(self, name, score):#相当于C++里面的构造函数,self表示创建的实例本身,相当于C++里面的this指针
self.name = name
self.score = score
和普通的函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self
,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别,所以,你仍然可以用默认参数、可变参数和关键字参数。
进行数据封装的好处:
>>> bart = Student('Bart Simpson', 59)
>>> lisa = Student('Lisa Simpson', 87)
>>> bart.age = 8
>>> bart.age
8
>>> lisa.age
Traceback (most recent call last):
File "" , line 1, in
AttributeError: 'Student' object has no attribute 'age'
通过在属性的名称前加上两个下划线__
,能让内部属性不被外部访问。在Python中,实例的变量名如果以__
开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。
关于几种下划线变量名的比较:
__xxx__
:表示特殊变量,有特殊用途(如__name__
表示函数的名字),可以直接访问,不是private变量;__xxx
:表示私有变量,不能直接从外部访问;_xxx
:外部可以访问,但按照约定俗成的规定,意为“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。总的来说,Python本身没有任何机制阻止你干坏事,一切全靠自觉。
e.g.
class Animal(object):#Animal是父类,继承object类
def run(self):
print 'Animal is running...'
class Dog(Animal):#Dog是Animal的子类
def run(self):#定义自己的run()方法,覆盖父类的方法
print 'Dog is running...'
class Cat(Animal):
def run(self):
print 'Cat is running...'
def run_twice(val_name):
val_name.run()
val_name.run()
>>>run_twice(Animal())
Animal is running...
Animal is running...
>>> run_twice(Dog())
Dog is running...
Dog is running...
在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行。
继承的两个好处:
多态的好处:
调用方只管调用,不管细节,具有“开闭”原则:
type()
判断type()
判断types
模块来判断某个对象的类型>>> type(123)
<type 'int'>
>>> type('str')
<type 'str'>
>>> type(abs)
<type 'builtin_function_or_method'>
>>> type(a)
<class '__main__.Animal'>
>>> import types
>>> type('abc')==types.StringType
True
>>> isinstance('a', str)
True
>>> isinstance(u'a', unicode)
True
>>>d = Dog()
>>> isinstance(d, Dog) and isinstance(d, Animal)
True
dir()
函数返回一个包含字符串的list
仅仅把属性和方法列出来是不够的,配合getattr()
、setattr()
以及hasattr()
,我们可以直接操作一个对象的状态
>>> setattr(obj, 'y', 19) # 设置一个属性'y'
>>> hasattr(obj, 'y') # 有属性'y'吗?
True
>>> getattr(obj, 'y') # 获取属性'y'
19
>>> obj.y # 获取属性'y'
19
通过内置的一系列函数,我们可以对任意一个Python对象进行剖析,拿到其内部的数据。要注意的是,只有在不知道对象信息的时候,我们才会去获取对象信息。