Python编程之面向对象

来源:互联网 发布:淘宝csv数据包制作 编辑:程序博客网 时间:2024/05/16 00:27

面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数

在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

给对象发消息实际上就是调用对象对应的关联函数,我们称之为对象的方法(Method)。

面向对象的抽象程度又比函数要高,因为一个Class既包含数据,又包含操作数据的方法

一、类和实例

class Student(object):    pass
bart = Student()

可以自由地给一个实例变量绑定属性,比如,给实例bart绑定一个name属性:

>>> bart.name = 'Bart Simpson'>>> bart.name'Bart Simpson
class Student(object):    def __init__(self, name, score):  #相当于构造方法,第一个参数永远是self,表示创建的实例本身        self.name = name        self.score = score
二、访问限制

在Python中,实例的变量名如果以__(两个)开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

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)
改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name实例变量.__score了:

在Python中,变量名类似__xxx__的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用__name____score__这样的变量名。

能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

>>> bart._Student__name'Bart Simpson'
三、继承与多态

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...
多态当子类和父类都存在相同的run()方法时,我们说,子类的run()覆盖了父类的run(),在代码运行的时候,总是会调用子类的run()

继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看做是父类。但是,反过来就不行

>>> b = Animal()>>> isinstance(b, Dog)False
四、获取对象信息

1、使用type()

>>> type(123)<type 'int'>>>> type('str')<type 'str'>>>> type(None)<type 'NoneType'>
>>> type(abs)<type 'builtin_function_or_method'>>>> type(a)<class '__main__.Animal'>
>>> import types>>> type('abc')==types.StringTypeTrue>>> type(u'abc')==types.UnicodeTypeTrue>>> type([])==types.ListTypeTrue>>> type(str)==types.TypeTypeTrue
2、使用isinstance()

isinstance()判断的是一个对象是否是该类型本身,或者位于该类型的父继承链上

>>> isinstance(h, Animal)True
能用type()判断的基本类型也可以用isinstance()判断:

>>> isinstance('a', str)True>>> isinstance(u'a', unicode)True>>> isinstance('a', unicode)False

并且还可以判断一个变量是否是某些类型中的一种,比如下面的代码就可以判断是否是str或者unicode:

>>> isinstance('a', (str, unicode))True>>> isinstance(u'a', (str, unicode))True



原创粉丝点击