从0开始的Python学习014面向对象编程

 简介



到目前为止,我们的编程都是根据数据的函数和语句块来设计的,面向过程的编程。还有一种我们将数据和功能结合起来使用对象的形式,使用它里面的数据和方法这种方法叫做面向对象的编程。

类和对象是面向对象编程的两个重要方面。对于类和对象的关系,举个例子就像学生和小明同学的关系一样。学生(类)是一个拥有共同属性的群体,小明同学(对象)是其中一个有自己特性的个体。

对于一个对象或类的变量被称为域,函数被称为类或对象的方法。

域有两种类型--属于每个对象或属于类本身,分别成为实例变量和类变量。

类使用class关键字创建,类的域和方法被列在一个缩进块中。

self



类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self

虽然你可以给这个参数任何名称,但是 强烈建议 你使用self这个名称——其他名称都是不赞成你使用的。使用一个标准的名称有很多优点——你的程序可以迅速识别它,如果使用self的话,还有些IDE(集成开发环境)也可以帮助你。

给C++/Java/C#程序员的注释
Python中的self等价于C++中的self指针和Java、C#中的this参考。

你一定很奇怪Python如何给self赋值以及为何你不需要给它赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1,
arg2)
的时候,这会由Python自动转为MyClass.method(MyObject, arg1,
arg2)
——这就是self的原理了。

这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数

(这个概念好长啊。。。。。。)


class 类名():
    代码块
‘‘‘the first class
    from liu    我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。

接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。(我们将在下面的章节中学习更多的如何创建实例的方法)。为了验证,我们简单地打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。

可以注意到存储对象的计算机内存地址也打印了出来。这个地址在你的计算机上会是另外一个值,因为Python可以在任何空位存储对象。
    ‘‘‘
class Person:
    pass # 空块 

p = Person()
print (p)
print(__doc__)

运行结果

我们使用class语句后跟类名,创建了一个新的类。这后面跟着一个缩进的语句块形成类体。在这个例子中,我们使用了一个空白块,它由pass语句表示。
接下来,我们使用类名后跟一对圆括号来创建一个对象/实例。为了验证,我们简单地打印了这个变量的类型。它告诉我们我们已经在__main__模块中有了一个Person类的实例。
可以注意到存储对象的计算机内存地址也打印了出来。这个地址在你的计算机上会是另外一个值,因为Python可以在任何空位存储对象。

对象的方法



对象的方法其实就是一个函数,只不过在这个函数会有一个特别的参数self。

class Person:
    def sayHi(self):
        print(‘Hello,how are you?‘)

p = Person()
p.sayHi()

运行结果

这个self感觉不到它的作用,但是还是要在参数中定义这是为什么呢?

去掉self

从报错中看出系统在调用这个类方法的时候默认给它传了一个参数,所以我们必须要有这个self,不为别的,因为报错。。。。。。

__init__方法



init是一个初始化块,在对象被建立的同时运行这个代码块,为你的对象初始化。需要注意的是名称的开始和结尾都要有两个下划线。

‘‘‘__init__方法
    __init__一个对象被建立的时候,马上运行。这个方法是对你的对象的初始化。
    这个名称的开始和结尾都是双下划线。‘‘‘

class Person:
    def __init__(self,name):
        self.name = name

    def sayHi(self):
        print(‘Hello,my name is ‘,self.name)

p = Person(‘happyLiu‘)
p.sayHi()

运行结果

感觉效果不明显。。。

class Person:
    def __init__(self,name):
        print(‘这是初始化块‘)
        self.name = name

    def sayHi(self):
        print(‘Hello,my name is ‘,self.name)

p = Person(‘happyLiu‘)
p.sayHi()

这样就好啦。

类与对象的变量



类的变量 由一个类的所有对象(实例)共享使用。

对象的变量 由类的每个对象/实例拥有。

可以理解为类的变量是这个类下所有对象公用的,而对象的变量是这个对象私有的。

一个很长的例子

class Person:
    population = 0

    def __init__(self,name):
        self.name = name
        print(‘Initalizing %s‘ % self.name)

        Person.population += 1

    def __del__(self):
        print(‘%s says bye.‘ % self.name)

        Person.population -= 1

        if Person.population == 0:
            print(‘I am the last one.‘)
        else:
            print(‘There are still %d people left.‘ % Person.population)

    def sayHi(self):
        print(‘Hi, my name is %s.‘ % self.name)

    def howMany(self):
        if Person.population == 1:
            print(‘I am the only person here.‘)
        else:
            print(‘We have %d persons here.‘ % Person.population)

happy = Person(‘happyLiu‘)
happy.sayHi()
happy.howMany()

bob = Person(‘bob james‘)
bob.sayHi()
bob.howMany()

del bob

happy.sayHi()
happy.howMany()

运行结果

__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候被调用。对象消逝即对象不再被使用,它所占用的内存将返回给系统作它用。

使用不同的对象的时候,就会调用类的方法,但是传的参数是这个对象自己的,所以我们面向对象的编程是非常灵活的。

继承


class 子类(父类):
    代码块

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系。

人是父类,男人是子类,小明是对象(小明没有对象,(¬︿??¬☆))。

一个子类型在任何需要父类型的场合可以被替换成父类型,即对象可以被视作是父类的实例,这种现象被称为多态现象

另外,我们会发现在 重用 父类的代码的时候,我们无需在不同的类中重复它。而如果我们使用独立的类的话,我们就不得不这么做了。

举个栗子


class SchoolMember:
    ‘‘‘Represents any school member.‘‘‘
    def __init__(self,name,age):
        self.name = name
        self.age = age
        print(‘(Initialized SchoolMember: %s)‘%self.name)

    def tell(self):
        ‘‘‘Tell my details.‘‘‘
        print(‘Name:%s Age:%d‘%(self.name,self.age))

class Teacher(SchoolMember):
    ‘‘‘Represents a teacher.‘‘‘
    def __init__(self,name,age,salary):
        SchoolMember.__init__(self,name,age)
        self.salary = salary
        print(‘(Initialized Teacher: %s)‘ % self.name)

    def tell(self):
        SchoolMember.tell(self)
        print(‘Salary:"%d"‘ % self.salary)

class Student(SchoolMember):
    ‘‘‘Represents a student.‘‘‘
    def __init__(self, name, age, marks):
        SchoolMember.__init__(self,name,age)
        self.marks = marks
        print(‘(Initialized Student: %s)‘ % self.name)

    def tell(self):
        SchoolMember.tell(self)
        print(‘Marks: "%d"‘%self.marks)

t = Teacher(‘Mr,Liu‘,25,3000)
s = Student(‘Swaroop‘, 22, 75)

print()

members = [t,s]
for member in members:
    member.tell()

运行结果

为了使用继承,我们把基本类的名称作为一个元组跟在定义类时的类名称之后。然后,我们注意到基本类的__init__方法专门使用self变量调用,这样我们就可以初始化对象的基本类部分。这一点十分重要——Python不会自动调用基本类的constructor,你得亲自专门调用它,SchoolMember.__init__(self,name,age)就是它,开始的时候无限报错的就是它。

小总结



我们已经研究了类和对象的多个内容以及与它们相关的多个术语。通过本章,你已经了解了面向对象的编程的优点和缺陷。Python是一个高度面向对象的语言,理解这些概念会在将来有助于你进一步深入学习Python。

原文地址:https://www.cnblogs.com/liuhappy/p/10640952.html

时间: 2024-08-02 12:23:36

从0开始的Python学习014面向对象编程的相关文章

Python学习笔记——面向对象编程

接下来学习面向对象编程,基础的就不记录了,只记录一些Python特有的或者高级的特性. http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318645694388f1f10473d7f416e9291616be8367ab5000 1. 类的定义 定义类使用class关键字,后面紧跟类名(首字母大写),接着是从哪个类继承下来的(所有类最终会继承object). 通过类名加参

Python学习之==>面向对象编程

一.面向对象与面向过程 面向对象与面向过程是两种不同的编程范式,范式指的是按照什么方式去编程.去实现一个功能.不同的编程范式本质上代表对各种不同类型的任务采取不同的解决问题的思路. 1.面向过程编程 角色是执行者,把一个项目按照一定的顺序,从头到尾一步步执行下去.这种思想好理解,但只要前面一个步骤变了,后面的步骤也要跟着变,维护起来比较麻烦. 2.面向对象编程 角色是指挥者,把一个项目分成一个个小的部分,每个部分负责一方面的功能,整个项目由这些部分组合而成一个整体.类似一个机关,分为各个职能部门

python学习day11 面向对象编程 类和实例

class Student(object): #class后面紧接着是类名,即Student,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的.通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类. def __init__(self,name,score): #通过定义一个特殊的__init__方法,在创建实例的时候,就把类的name,score等属性绑上去,__init__方法的第一个参数永远是self,表示创建的实例本身,因此,在__

python学习日记-面向对象编程(一)

python的类(class)和实例(instance) 假设一种鞋子(shoe)有尺码(size)和颜色(color)两种属性,以此为例. 类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去.通过定义一个特殊的__init__方法,在创建实例的时候,就把size,color属性绑到shoe上去,例如: 1 class Shoe(object): 2 3 def __int__(self, size, color): 4 self.size = size

python学习之面向对象高级特性

类属性与实例属性类属性就是类对象所拥有的属性,它被所有类对象的实例对象所共有,在内存中只存在一个副本.在前面的例子中我们接触到的就是实例属性(对象属性),它不被所有类对象的实例对象所共有,在内存中的副本个数取决于对象个数. 05_类属性鱼实例属性.py import random class Turtle(object): # power是类属性. power = 100 def __init__(self): # x,y:实例属性. self.x = random.randint(0, 10)

Day6 - Python基础6 面向对象编程

Python之路,Day6 - 面向对象学习 本节内容: 面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法. 引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战>的游戏,你就思考呀,人狗作战,那至少需要2个角色,一个是人, 一个是狗,且人和狗都有不同的技能,比如人拿棍打狗, 狗可以咬人,怎么描述这种不同的角色和他们的功能呢? 你搜罗了自己掌握的所有技能,写出了下面的代码来描述这两个角色 1 2 3 4 5 6 7 8 9 10 11

Python学习记录-socket编程

Python学习记录-socket编程 学习 python socket Python学习记录-socket编程 1. OSI七层模型详解 2. Python socket 3. socket()函数 4. TCP socket通信流程 5. Python Internet 模块 1. OSI七层模型详解 以上图见:http://blog.csdn.net/yaopeng_2005/article/details/7064869 其它详情可参考:socket网络基础 2. Python sock

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

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

python学习_day26_面向对象之封装

1.私有属性 (1)动态属性 在python中用双下划线开头的方式将属性隐藏起来.类中所有双下划线开头的名称,如__x都会自动变形成:_类名__x的形式.这种自动变形的特点是: a.类中定义的__x只能在内部使用,如self.__x,引用的就是变形的结果.b.这种变形其实正是针对外部的变形,在外部是无法通过__x这个名字访问到的.c.在子类定义的__x不会覆盖在父类定义的__x,因为子类中变形成了:_子类名__x,而父类中变形成了:_父类名__x,即双下滑线开头的属性在继承给子类时,子类是无法覆