python笔记--面向对象

面向对象编程

面向对象编程是一种编程方式,需要使用 “类” 和 “对象” 来实现:

类就是一个模板,模板里可以包含多个函数,函数里实现一些功能,实现对具有共同特征的事物的描述;

对象是类的实体,是一种数据类型。它不存在内存中,不能被直接操作,只有被实例化对象时,才会变的可操作。举例说明:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Student():    #calss是关键字,表示类Student是类的名称,通常首字母大写。
s=100               #类属性,属于全局变量。
‘’’
这是一个测试类#给类添加注释
‘’’
    def name(self,name):    #类中的函数,第一个参数必须是self。
        print ‘I am %s‘%name
def score(self):
print self.s                #方法中调用类属性
obj=Student()               #obj就是对象的实例化,可使用tyte(obj)查看其类型。
obj.name(‘zhangsan‘)        #调用类的方法,输出结果为”I am zhangsan”

一、__init__初始化实例属性

python中定义了一个__init__方法,可以初始化类变量、传递类的参数,例如:

#初始化类变量

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Student():
    def __init__(self):        #__init__函数定义到类的开头
        self.name=‘zhangsan‘   #初始化变量,在以后的函数中可以调用。
        self.score=100
    def print_score(self):
        print ‘%s:%s‘%(self.name,self.score)    #调用self.name
f=Student()
f.print_score()

注意:self.name 变量是一个实例属性,只能在类方法中使用。

#传参

#!/usr/bin/env python
# -*- coding:utf-8 -*-
class Student():
    def __init__(self,a,b):
        self.name=a    #初始化变量,只不过赋予的不是固定值,是一个可变参数。
        self.score=b
    def print_score(self):
        print ‘%s:%s‘%(self.name,self.score)
f=Student(‘zhangsan‘,‘100‘)    #定义参数,传递给__init__函数
f.print_score()

注意:我们没有专门调用__init__方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给__init__方法。

二、私有属性

以双下划线开头的变量,表示私有变量,受保护的,只能类本身能访问,连子类也不能访问,例如:

#!/usr/bin/env python
class Info():
    def __init__(self):
        self.__name=‘zhangsan‘
    def say(self):
        print self__name
a=Info()
print a.__name

执行以上代码会报错:AttributeError: Info instance has no attribute ‘__name‘

事实上这是一种伪私有,例如:

#!/usr/bin/env python
class Info():
    def __init__(self):
        self.__name=‘zhangsan‘
    def say(self):
        print self__name
a=Info()
print a._Info__name    #在属性前面加上_classname依然可以打印出来

注意:Python 中的以双下滑开头的类方法名,在类实例化以后会自动被概念,在其名字前加 _classname ,因为名字被改了,所以自然无法用双下滑开头的名字被访问,从而达到不可进入的目的。

详细的私有属性描述,可以参考:

http://blog.itpub.net/26250550/viewspace-1411768/

三、面向对象的三大特性

1.封装

通过上面的例子,可以看到面向对象编程需要两个步骤:

(1)将内容封装到某处

通过创建类、实例化对象,其实就是将内容封装到对象中了。

(2)从某处调用被封装的内容

调用被封装的内容,一般有两种情况:

#通过对象直接调用(第一个例子)

#通过self间接调用(第二个例子)

2.继承

子类继承父类的属性和方法,能够提高代码的重用。

#简单继承

#!/usr/bin/env python
class Student():
    def __init__(self,a,b):
        self.name=a
        self.score=b
    def print_score(self):
        print ‘%s:%s‘%(self.name,self.score)
class One(Student):#子类:One,父类:Student
    pass
f=One(‘zhangsan‘,100)
print f.name#调用父类的属性
f.print_score()#调用父类的方法
#输出结果如下:
zhangsan
zhangsan:100

#子类实例初始化

如果子类实例属性初始化了,那父类的属性和方法是不会被继承的:

#!/usr/bin/env python
class Boy():
    def __init__(self):
        self.sex=‘boy‘
        self.height=‘170‘
    def print_mes(self):
        print ‘sex:%s,hei:%s‘%(self.sex,self.height)
class Name(Boy):
    def __init__(self):    #子类初始化实例属性
        self.name=‘zhangsan‘
    def print_name(self):
        print ‘name:%s‘%self.name
f=Name()
print f.name
f.print_name()
f.print_mes()
#异常信息如下:
AttributeError: Name instance has no attribute ‘sex‘

没有找到父类中的属性,说明父类中的方法并没有被子类继承。

解决方法一:

#!/usr/bin/env python
class Boy():
    def __init__(self):
        self.sex=‘boy‘
        self.height=‘170‘
    def print_mes(self):
        print ‘sex:%s,hei:%s‘%(self.sex,self.height)
class Name(Boy):
    def __init__(self):
        Boy.__init__(self)    #将父类的__init__方法添加到子类中
        self.name=‘zhangsan‘
    def print_name(self):
        print ‘name:%s‘%self.name
f=Name()
print f.name
f.print_name()
f.print_mes()

解决方法二:

#!/usr/bin/env python
class Boy(object):    #需要指定基类object(新式类)
    def __init__(self):
        self.sex=‘boy‘
        self.height=‘170‘
    def print_mes(self):
        print ‘sex:%s,hei:%s‘%(self.sex,self.height)
class Name(Boy):
    def __init__(self):
        super(Name, self).__init__()    #使用super函数(super只能用于新式类)
        self.name=‘zhangsan‘
    def print_name(self):
        print ‘name:%s‘%self.name
f=Name()
print f.name
f.print_name()
f.print_mes()

#多重继承

子类有多个父类,如果调用的属性或方法在子类中没有,就会从父类中查找。在经典类和新式类中,查找的方式不同。python3.0之后不再经典类,统一为新式类。

经典类:

默认没有父类,多继承情况下,会按照深度优先方式查找。

新式类:

有继承的类,如果没有,可以继承 object。多继承情况下,会按照广度优先方式查找。

举例说明:

class D:    #经典类
    def bar(self):
        print ‘D.bar‘
class C(D):
    def bar(self):
        print ‘C.bar‘
class B(D):
    def bar(self):
        print ‘B.bar‘
class A(B, C):
    def bar(self):
        print ‘A.bar‘
a = A()
a.bar()

执行bar方法时:

首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中没有,则继续去D类中找,如果D类中么有,则继续去C类中找,如果还是未找到,则报错。

所以,查找顺序:A --> B --> D --> C

在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了。

class D(object):    #新式类
    def bar(self):
        print ‘D.bar‘
class C(D):
    def bar(self):
        print ‘C.bar‘
class B(D):
    def bar(self):
        print ‘B.bar‘
class A(B, C):
    def bar(self):
        print ‘A.bar‘
a = A()
a.bar()

执行bar方法时:

首先去A类中查找,如果A类中没有,则继续去B类中找,如果B类中没有,则继续去C类中找,如果C类中么有,则继续去D类中找,如果还是未找到,则报错。

所以,查找顺序:A --> B --> C --> D

在上述查找bar方法的过程中,一旦找到,则寻找过程立即中断,便不会再继续找了。

#多态

class F1:
    pass
class S1(F1):
    def show(self):
        print ‘S1.show‘
class S2(F1):
    def show(self):
        print ‘S2.show‘
def Func(obj):
    print obj.show()
s1_obj = S1()
Func(s1_obj)
 
s2_obj = S2()
Func(s2_obj)
#为了让Func函数既可以执行S1对象的show方法,又可以执行S2对象的show方法,所以,定义了一个S1和S2类的父类,而实际传入的参数是:S1对象和S2对象。

从上面这个例子可以看出,相同的消息可能会送给多个不同的对象,而系统可依据对象所属类,引发对应类的方法,而有不同的行为,这就是多态的特点。

 

时间: 2024-08-03 06:16:52

python笔记--面向对象的相关文章

python笔记 - day7-1 之面向对象编程

python笔记 - day7-1 之面向对象编程 什么时候用面向对象: 多个函数的参数相同: 当某一些函数具有相同参数时,可以使用面向对象的方式,将参数值一次性的封装到对象,以后去对象中取值即可: sele是什么? self是一个python自动会给传值得参数: 哪个对象执行方法,self就是哪个对象: 构造方法: 类中有一个特殊的方法,__init__,类()自动执行: 面向对象,三大特性: 封装,继承,多态:  

Python:笔记(3)——面向对象编程

Python:笔记(3)--面向对象编程 类型与对象 术语 程序中存储的所有数据都是对象.每个对象都有一个身份.一个类别和一个值. 如:a=42,就是用值42创建了一个整数对象. 大多数对象都拥有大量特点的属性和方法. 属性就是与对象相关的值. 方法就是被调用时将在对象上执行某些操作的函数. 使用 . 运算符可以访问属性和方法. Python中对象的一些说明 检查对象类型最佳的方式是利用内置函数 isinstance(object,type) 所有对象都有引用计数,当一个对象的引用计数归零时,他

Python 2.7 学习笔记 面向对象的编程

python是一种面向对象的语言.本文介绍如何用python进行面向对象的编程. 首先我们说下对象和类,类是一种类型的定义,对象是类的实例. 一.内置对象类型(内置类) 其实我们前面已经大量用到了对象,如字符串.列表.字典等,这些对象的类型是python的内建对象类型. 比如: a=[] 这其实就是创建了一个空的列表对象,并将它赋值给变量a,变量a就指向了一个列表对象. 那列表对象对应的类是什么呢?其实列表对象对应的类名是list. 我们还可以通过类来创建对象,看下例子: >>> pri

Python笔记(四)

在<Python笔记(三)>中,我记录关于Python中序列问题的知识.个人觉得确实比Java中的集合框架简单.之前也说了,Python是一种高级面向对象的语言,它的每一个变量都称为对象.今天我接触了面向对象的编程.下面是这篇博客的目录: 1.类与对象 2.输入输出 3.异常 类与对象: 我们都知道面向对象的语言具备四个特性:抽象,继承,封装,多态.Java,C++是这样,Python也不例外.在Python中,我们定义一个类,使用关键字class.形式如下:class classname:.

python笔记 - day8

python笔记 - day8 参考: http://www.cnblogs.com/wupeiqi/p/4766801.html http://www.cnblogs.com/wupeiqi/articles/5017742.html 大纲 面向对象三大特性之多态 类成员之静态字段和普通字段 类成员之普通方法和静态方法以及类方法 类成员之属性 类成员之成员修饰符 类成员之特殊成员 其他之isinstance和issubclass 其他之super的应用 实例之自定义有序字典 单例模式 基本异常

python笔记 - day7

python笔记 - day7 参考: http://www.cnblogs.com/wupeiqi/articles/5501365.html 面向对象,初级篇: http://www.cnblogs.com/wupeiqi/p/4493506.html 大纲: configparser模块 XML模块 shutil模块以及压缩包处理 subprocess模块 面向对象学习 configparser: 模块解析:configparser用于处理特定格式的文件,其本质上是利用open来操作文件.

My way to Python - Day05 - 面向对象-思维导图

My way to Python - Day05 - 面向对象 思维导图

Python笔记_01列表 和元祖

Python笔记 第一章 列表和元祖 1.通用序列操作 所有序列都可以进行某些特定操作,包括:索引(indexing).分片(slicing).加(adding).乘(multiplying)以及检查某元素是否属于列表成员. 迭代:依次对序列中的每个元素重复执行某些操作. 序列的索引:通过元素在列表中的位置可以定位到该元素,这就是列表的索引,使用类似于list[0]对元素进行索引,索引0指向第一个元素.也可使用负数对元素进行索引,使用负数对元素索引时,列表中的最后一个元素由-1表示,例如list

大话设计模式学习笔记——面向对象基础

前言 好记性不如烂"笔头"系列--大话设计模式学习笔记 目录 面向对象基础 面向对象基础 什么是类与实例 一切事物皆为对象,即所有的东西老师对象,对象就是可以看到.感觉到.听到.触摸到.尝到.或闻到的东西.准确地说,对象是一个自包含的实体,用一组可识别的特性和行为来标识.面向对象编程,英文叫 Object-Oriented Programming,其实就是针对对象来进行编程的意思.类就是具有相同属性和功能的对象的抽象集合.实例就是一个真实的对象.比如我们属于'人'类,而个人就是'人'类