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
- 属性
对象的某个静态特征,比如上述代码中的title
、author
和__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有三个属性,title
、author
和__context
分别表示标题、作者和内容,通过构造函数传入
这里代码很直观,可以看到intercept_context
能修改对象harry_potter_book
的__context
属性
- 私有属性
这里唯一需要强调的一点是,如果一个属性以__(注意,两个 _)开头,默认这个属性是私有属性
私有属性,是指不希望在类的函数之外的地方被访问和修改的属性。所以,可以看到title
和author
能够很自由地被打印出来,但是print(harry_potter_book.__context)
就会报错
以上是关于Python核心面向对象的主要内容,如果未能解决你的问题,请参考以下文章