Python核心面向对象

Posted sysu_lluozh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python核心面向对象相关的知识,希望对你有一定的参考价值。

从C++或者JAVA 语言入手学编程,好不容易搞懂了最基本的数据类型、赋值判断和循环,却又迎面撞上了OOP(object oriented programming)的大墙,一头扎进公有私有保护、多重继承、多态派生、纯函数、抽象类、友元函数等一堆专有名词的汪洋大海中找不到彼岸,于是就放弃了进阶之路

相比之下,Python是一门相对友好的语言,它在创立之初就鼓励命令交互式的轻量级编程

传统的命令式语言有无数重复性代码,虽然函数的诞生减缓了许多重复性,但随着计算机的发展,只有函数依然不够,需要把更加抽象的概念引入计算机才能缓解(而不是解决)这个问题,于是OOP应运而生

Python一步步攻城掠地飞速发展,从最基础的脚本程序,到后来可以编写系统程序、大型工程、数据科学运算、人工智能,早已脱离了当初的设计,因此一些其他语言的优秀设计之处依然需要引入

一、对象,你找到了吗

先来学习,面向对象编程中最基本的概念

1.1 生活类比

为了方便理解其中的抽象概念,打个比方感受一下
生物课上,学过"界门纲目科属种"的概念,核心思想是科学家们根据各种动植物、微生物的相似之处,将其分化为不同的类型方便研究。生活中也是如此,习惯对身边的事物进行分类:

  • 猫和狗都是动物
  • 直线和圆都是平面几何的图形
  • 《哈利波特》和《冰与火之歌》都是小说

自然,同一类事物便会有着相似的特性:

  • 动物会动
  • 平面图形有面积和周长
  • 小说有相应的作者和大致情节等各种元素

1.2 几个概念

那回到Python上又对应哪些内容呢?这里,先来看一段最基本的Python面向对象的应用代码


class Document():
    def __init__(self, title, author, context):
        print('init function called')
        self.title = title
        self.author = author
        self.__context = context # __开头的属性是私有属性

    def get_context_length(self):
        return len(self.__context)

    def intercept_context(self, length):
        self.__context = self.__context[:length]

harry_potter_book = Document('Harry Potter', 'J. K. Rowling', '... Forever Do not believe any thing is capable of thinking independently ...')

print(harry_potter_book.title)
print(harry_potter_book.author)
print(harry_potter_book.get_context_length())

harry_potter_book.intercept_context(10)

print(harry_potter_book.get_context_length())

print(harry_potter_book.__context)

########## 输出 ##########

init function called
Harry Potter
J. K. Rowling
77
10

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-b4d048d75003> in <module>()
     22 print(harry_potter_book.get_context_length())
     23 
---> 24 print(harry_potter_book.__context)

AttributeError: 'Document' object has no attribute '__context'

参照着这段代码,先简单解释几个概念

一群有着相似性的事物的集合,这里对应Python的class

  • 对象

集合中的一个事物,这里对应由class生成的某一个object,比如代码中的harry_potter_book

  • 属性

对象的某个静态特征,比如上述代码中的titleauthor__context

  • 函数

对象的某个动态能力,比如上述代码中的intercept_context()函数

1.3 类的严谨定义

当然,这样的说法既不严谨,也不充分,但如果对面向对象编程完全不了解,它们可以让你迅速有一个直观的了解

还是通过刚刚那段代码,再给类下一个更为严谨的定义

1.3.1 什么是类

类,一群有着相同属性和函数的对象的集合

虽然有循环论证之嫌,但是反复强调还是希望能对面向对象的最基础的思想,有更真实的了解。清楚记住这一点后,接下来具体解读刚刚这段代码


class Document():
    def __init__(self, title, author, context):
        print('init function called')
        self.title = title
        self.author = author
        self.__context = context # __开头的属性是私有属性

    def get_context_length(self):
        return len(self.__context)

    def intercept_context(self, length):
        self.__context = self.__context[:length]

harry_potter_book = Document('Harry Potter', 'J. K. Rowling', '... Forever Do not believe any thing is capable of thinking independently ...')

print(harry_potter_book.title)
print(harry_potter_book.author)
print(harry_potter_book.get_context_length())

harry_potter_book.intercept_context(10)

print(harry_potter_book.get_context_length())

print(harry_potter_book.__context)

########## 输出 ##########

init function called
Harry Potter
J. K. Rowling
77
10

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-5-b4d048d75003> in <module>()
     22 print(harry_potter_book.get_context_length())
     23 
---> 24 print(harry_potter_book.__context)

AttributeError: 'Document' object has no attribute '__context'

可以看到,class Document定义了Document类,再往下能看到它有三个函数,这三个函数即为 Document类的三个函数

1.3.2 init构造函数

其中,init表示构造函数,意即一个对象生成时会被自动调用的函数
可以看到harry_potter_book = Document(...)这一行代码被执行的时候,init function called字符串会被打印出来

1.3.3 普通函数

get_context_length()intercept_context()则为类的普通函数,调用它们来对对象的属性做一些事情

1.3.4 类的属性

class Document有三个属性,titleauthor__context分别表示标题、作者和内容,通过构造函数传入
这里代码很直观,可以看到intercept_context能修改对象harry_potter_book__context属性

  • 私有属性

这里唯一需要强调的一点是,如果一个属性以__(注意,两个 _)开头,默认这个属性是私有属性

私有属性,是指不希望在类的函数之外的地方被访问和修改的属性。所以,可以看到titleauthor能够很自由地被打印出来,但是print(harry_potter_book.__context)就会报错

以上是关于Python核心面向对象的主要内容,如果未能解决你的问题,请参考以下文章

python之基础篇——类与面向对象

Python 七Python类与面向对象

Python面向对象基础

python ==》 面向对象

Python基础之(面向对象初识)

python之路 面向对象