python学习笔记(面向对象)
一、什么是类
文章目录
python是一门面向对象的编程语言,那么什么是面向对象呢?我们来简单打个比方,整个现实社会就好比我们的一个程序,在现实社会中存在的,类似于人、动物、桥梁、建筑等具体事物,就像我们的对象。
世间万物皆对象。
每个对象都有各自的特征,也有很多相同的特征,比如黑种人和黄种人,他们在肤色上,长相上都大相径庭,但是他们都有手、脚、眼睛等公共的特征,这个时候,类的概念就出现了。
类是用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。
在上面的定义中我们可以发现两个关键词,属性和方法。如何定义这两个关键字,我们同样来打个比方。
例如一个黄种人,他有两个眼睛,一张嘴巴,两条腿,长得还挺帅(就是头发有点儿少),这就是他的属性。
这个黄种人还会跑,会吃饭,还会敲代码,这就是他的方法。
通过定义类的方式来构建一个面向对象的程序有什么好处呢?下面给大家分享一个小故事。
说是三国时期,曹操在宴会上酣畅淋漓,诗兴大发,写下“我很高兴,歌以咏志”。大臣们纷纷叫好,命令小的赶紧将曹丞相的诗做成牌匾。第二天酒醒后,曹操看到牌匾,诶,这诗是我写的?怎么这么庸俗?赶紧给我撤了,重新给我做一个,我想想,就”幸甚致哉,歌以咏至“吧。属下赶紧去把牌匾扔了重新做了一个。
定义类就好比活字印刷,如果采取了活字印刷的手段,曹丞相的第二个牌匾只需要修改四个字即可,可以节约很大一部分工作量,对于我们的编程来说也是这样。
大概了解类过后,我们来尝试着创建一个类吧!
二、创建一个简单的类
class 类名:
# 属性:
# 动作:
这就是定义一个类的最基本的格式,下面我们来创建一个手机类吧:
手机的属性有颜色,品牌,大小等等属性,同时又有打电话,刷微博等方法;
class Phone:
brand = 'HUAWEI' # 定义一个品牌属性
colour = 'yellow' # 定义一个颜色属性
size = 'big' # 定义一个大小属性
def call(self): # 定义一个打电话的方法
print('我可以打电话!')
def weibo(self): # 定义一个刷微博的方法
print('我可以刷微博!')
大家可以发现,定义属性与定义变量时有相似之处,而在定义方法时又和定义函数有相似的地方,但是在定义方法的时候,我们发现参数框中出现了一个self参数,这是一个什么东西呢?
self直译过来是”自己“的意思,在之前我们也讲到,类是用来描述具有相同的属性和方法的对象的集合,意味着我们在类中定义的每一个方法,都要具体到对象才会有实际的意义,python解释器也给了我们这样规范的语法。接下来,我们就会用我们创建的这个手机类来创建一个正儿八经的手机。
# 使用类来创建对象
P20 = Phone()
print(P20)
brand = P20.brand
print(brand)
P20.call()
-----------------------------------------------------------------------------------------
<__main__.Phone object at 0x000001A411D5CFD0>
HUAWEI
我可以打电话!
这样我们就创建了一个Phone这个类里面的P20对象,通过类来创建对象的格式类似于函数声明,通过.可以调用属性和方法。
如果这个时候我们发现手机品牌不是华为,想要修改一下怎么办呢?
按照我们之前的修改变量的方法,通常我们会这么做:
P20.brand = 'xiaomi'
print(P20.brand)
-----------------------------------------------------------------------------------------
xiaomi
果然我们修改成功了,在这个时候大家也许会有个疑问,我修改了P20的brand,Phone里面的brand会不会跟着改变呢?
brand = Phone.brand
print(brand)
HUAWEI
大家估计对这个结果不会感到太意外,毕竟我们只是修改了P20里面的brand嘛。来深究一下,当我们在定义一个类的时候,python底层会给我们创建一个类的空间,通过类来创建对象的时候,又会给这个对象分配一个空间,在对象的这个空间中拥有类里面的所有属性和方法。两个空间互不影响,所以当我们在修改对象属性时自然也就不会影响到类空间里面的东西。
所以我们也可以在对象的空间中添加一些类里面没有的属性,具体大家可以自己动手操作一下。
在这里涉及到了两个新的概念,类属性和对象属性。其实在前文介绍中也有所提及,类属性是指这一个大类所共有的属性,而对象属性则是该对象所特有的,在之后的内容中,关于二者的区分会有更详细的解释。
对类有了基本的了解后,我们来研究一些更深层次的东西。
三、类中的方法:动作
在上面章节的讲述中,我们大概了解了”方法“这个概念,接下来我们将会更深入地研究一下”方法“的奥秘。
方法的种类:
大体可以分为以下四种:
- 普通方法
- 类方法
- 静态方法
- 魔术方法
1、普通方法
# 普通方法格式:
def 方法名(self,[参数,参数]):
pass
在上一节的操作中我们在类里面创建了一个没有参数的方法,类中的方法同函数类似,同样可以在里面添加参数。
class Phone:
brand = 'xiaomi'
price = 4999
type = 'mate 80'
# Phone类里面的方法:call
def call(self): # self 自身
print('---------------', self)
print('正在访问通讯录:')
for person in self.address_book:
print(person.items())
print('正在打电话....')
print('留言:', self.note)
phone1 = Phone()
phone1.note = '我是phone1的note'
phone1.address_book = [{
'18982409867': '吴彦祖'}, {
'18023300819': '刘德华'}]
print(phone1)
phone1.call()
-----------------------------------------------------------------------------------------
--------------- <__main__.Phone object at 0x000002A4573FCFD0>
正在访问通讯录:
dict_items([('18982409867', '吴彦祖')])
dict_items([('18023300819', '刘德华')])
正在打电话....
留言: 我是phone1的note
我们在创建一个Phone这个类以后又创建了phone1这个对象,同时在phone1中添加了address_book和note两个对象属性,这时候通过phone1来使用call这个方法就可以正常调用了。
虽然我们在运行的时候不会报错,但是在pycharm里面会出现黄色的标记以示警告,说明我们这种书写方法是不规范的,相信大家大概明白为什么会出现这样的情况。
如同前文所说,对象空间与类空间是两个独立的存在,我们在对像空间里面添加属性并不会影响到类空间,当我们通过这个类空间再创建一个对象时,新的对象只会拥有公共的类属性而不会带有前一个对象的属性,在新的对象中使用call()这个方法则会因为找不到参数而报错。
为了避免这样的问题出现,我们需要提前引入一个魔术方法。
class Phone:
# 魔术方法:__init__
def __init__(self, brand, price):
self.brand = brand
self.price = price
# 放在这里面的属性可以让对象动态添加
def show(self):
print('品牌:{},价格:{}'.format(self.brand, self.price))
p = Phone('HUAWEI', '5000')
p.show()
--------------------------------