面向对象的编程(1)——简明python教程学习笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sinat_33238946/article/details/82595387

本文大量内容来源于沈老师的简明python教程,其中夹杂部分个人的理解如有偏颇之处还望海涵。

一.简介

到目前为止,在我们的程序中,我们都是根据操作数据的函数或语句块来设计程序的。这被称为面向过程的编程
还有一种把数据和功能结合起来,用称为对象的东西包裹起来组织程序的方法。这种方法称为面向对象的编程编程理念。在大多数时候你可以使用过程性编程,但是有些时候当你想要编写大型程序或是寻求一个更加合适的解决方案的时候,你就得使用面向对象的编程技术。

Object-oriented programming (OOP) is a programming paradigmbased on the concept of “objects”, which may contain data, in the form of fields, often known as attributes; and code, in the form ofprocedures, often known as methods. A feature of objects is that an object’s procedures can access and often modify the data fields of the object with which they are associated (objects have a notion of “this” or “self”). In OOP, computer programs are designed by making them out of objects that interact with one another.[1][2] There is significant diversity of OOP languages, but the most popular ones are class-based, meaning that objects are instances of classes, which typically also determine their type.
面向对象编程(OOP)是一种基于“对象”概念的编程范例,它可能包含字段形式的数据,通常称为属性;以及以程序的形式存在的代码,通常称为方法。 对象的一个特性是对象的过程可以访问并经常修改与之关联的对象的数据字段(对象具有“this”或“self”的概念)。在OOP中,计算机程序的设计是通过彼此交互的对象来实现的。[1] [2] OOP语言有很多种,但最流行的是基于类的,这意味着对象是类的实例,通常也决定了它们的类型。
—— WIKIPEDIA

对象是面向对象编程的两个主要方面。类创建一个新类型,而对象则这个类的实例 。这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象)。
对象可以使用普通的属于对象的变量存储数据。属于一个对象或类的变量被称为域。对象也可以使用属于类的函数来具有功能。这样的函数被称为类的方法。这些术语帮助我们把它们与孤立的函数和变量区分开来。域和方法可以合称为类的属性。
域有两种类型——属于每个实例/类的对象或属于类本身。它们分别被称为实例变量和类变 量。
类使用class关键字创建。类的域和方法被列在一个缩进块中。

二.self

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

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

三.类

#Filename:简单类的创建.py

class Person:
    pass  #An empty block

p=Person()
print(p)

输出为

<__main__.Person object at 0x03C17470>

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

四.对象的方法

1.使用对象的方法

# Filename:method.py

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

p = Person()
p.sayHi()

#This short example can also be written as Person().sayHi()

输出为

Hello,how are you?

我们看到了self的用法。注意sayHi方法没有任何参数,但仍然在函数定义时有self。

2. __init__方法

在Python的类中有很多方法的名字有特殊的重要意义。现在我们将学习__init__方法的意义。
__init__方法在类的一个对象被建立时,马上运行。这个方法可以用来对你的对象做一些你希 望的 初始化 。注意,这个名称的开始和结尾都是双下划线。

# Filename:class_objection.py

class Person:
    def __init__(self,name):
        self.name=name
    def sayHi(self):
        print('Hello,my name is',self.name)

p=Person('DanielZhu')
p.sayHi()

# This short example can also be written as Person('DanielZhu').sayHi()

输出为

Hello,my name is DanielZhu

这里,我们把__init__方法定义为取一个参数name(以及普通的参数self)。在这个__init__里, 我们只是创建一个新的域,也称为name。注意它们是两个不同的变量,尽管它们有相同的名字,我们能够简单的区分它们。
最重要的是,我们没有专门调用__init__方法,只是在创建一个类的新实例的时候,把参数包括在圆括号内跟在类名后面,从而传递给__init__方法。这是这种方法的重要之处。
现在,我们能够在我们的方法中使用self.name域。这在sayHi方法中得到了验证。

五.类与对象的方法

我们已经讨论了类与对象的功能部分,现在我们来看一下它的数据部分。事实上,它们只是与 类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提下有效。
有两种类型的 域 ——类的变量和对象的变量,它们根据是类还是对象 拥有 这个变量而区分。
类的变量 由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象 对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。
对象的变量 由类的每个对象/实例拥有。因此每个对象有自己对这个域的一份拷贝,即它们不 是共享的,在同一个类的不同实例中,虽然对象的变量有相同的名称,但是是互不相关的。一个简单的实例可以帮助我们理解;

使用类与对象的变量

#Filename:objvar.py

class Person:
     '''Represents a person'''
     population = 0
     def __init__(self,name):
         '''Initializes the person's data.'''
         self.name = name
         print('(Initializing %s)'% self.name)
         # when this person is created,he/she
         # adds to the population
         Person.population += 1
     def __del__(self):
         '''I am dying.'''
         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):
          '''Greeting by the person.
          Really,that's all it does.'''
          print('Hi,my name is %s.' % self.name)
     def howMany(self):
        '''Prints the current population.'''
        if Person.population == 1:
           print('I am the only person here.')
        else:
           print('We have %d persons here.'% Person.population)

DanielZ = Person('DanielZ')
DanielZ.sayHi()
DanielZ.howMany()

DanielX = Person('DanielX')
DanielX.sayHi()
DanielX.howMany()

DanielZ.sayHi()
DanielZ.howMany()

输出:

(Initializing DanielZ)
Hi,my name is DanielZ.
I am the only person here.
(Initializing DanielX)
Hi,my name is DanielX.
We have 2 persons here.
Hi,my name is DanielZ.
We have 2 persons here.
DanielZ says bye.
There are still 1 people left.
DanielX says bye.
I am the last one.

在该实例中:population属于Person 类,因此是一个类的变量。name变量属于对象(它使用self赋值)因此是对象的变量。
观察可以发现__init__方法用一个名字来初始化Person实例。在这个方法中,我们让population 增加1,这是因为我们增加了一个人。同样可以发现,self.name的值根据每个对象指定,这表 明了它作为对象的变量的本质。
记住,你只能使用self变量来参考同一个对象的变量和方法。这被称为 属性参考 。
在这个程序中,我们还看到docstring对于类和方法同样有用。我们可以在运行时使用Person. __doc__和Person.sayHi.__doc__来分别访问类与方法的文档字符串。
就如同__init__方法一样,还有一个特殊的方法__del__,它在对象消逝的时候被调用。对象消 逝即对象不再被使用,它所占用的内存将返回给系统作它用。在这个方法里面,我们只是简单 地把Person.population减1。
当对象不再被使用时,__del__方法运行,但是很难保证这个方法究竟在 什么时候 运行。如果 你想要指明它的运行,你就得使用del语句,就如同我们在以前的例子中使用的那样。

展开阅读全文

没有更多推荐了,返回首页