
【千锋教育干货暴击】
如果你想更好的学习Python乃至转行,弯道超车,快人一步!本课程零基础即可加入学习,抓住大数据、机器学习、人工智能时代的红利,开启你的第一行代码吧!
↓ ↓ ↓
千锋教育Python教程_700集零基础Python入门到精通教程(保姆级新手教程)
千锋教育Python教程全套_python零基础入门到精通(学完可达到Python工程师水平)

本文章的思路是:
介绍面向对象概念,世界万物皆对象
类的定义
类中属性、方法的添加
对象的创建
属性和方法的调用
对象属性的添加
方法间调用
在介绍面向对象前,我们首先理解下什么是面向对象。举一个大家都很熟悉的例子,大象放到冰箱需要几步?
我们第一想法可能是,大象能放到冰箱吗?其实这不重要问的是步骤。

那这三个步骤跟我们编程有关系吗?有关系!
因为我们所有的编程都是按照人的思维方式来实现的。但是上面更加强调的是步骤而不是面向对象,所以是面向过程。
面向过程更加注重步骤,如果某个步骤实现遇到问题,程序可能就不能继续。
在面向对象的世界里不会首先关注过程、步骤,就是你怎么放进去的。而是关注对象。
在这个过程中涉及几个对象,其中大象和冰箱就是这个题目中的对象。
大象有很多品种,是所有的大象都是这么做吗?题目中说的并不是某一个种类的大象,而是大象这类,所以无论你是什么大象最后都是关进冰箱。
冰箱也有很多的型号,颜色,大小,品牌 啊等,是指所有的冰箱吗?当然冰箱指的是所有冰箱的统称,也是一类---冰箱类
所以,世界万物皆对象!!
类就是一个群体,这个群体是所有的统称。比如人类,无论你是中国人、美国人、韩国人还是日本人,这些都叫人类。 再比如说:汽车类,指的也是一个群体,劳斯莱斯、奔驰、奥迪、宝马、比亚迪、大众等等就是车这一类。
朋友们!你们想想生活中还有哪些类呢?
手机类、电脑类、水杯类、植物类、学生类、老师类、水果类、蔬菜类、房子类、医生类、演员类......
大家发现这些类跟我们生活息息相关,就是将生活中的人与人、人与物的沟通在电脑上体现出来,比如我们常用的购物网站
点开一个购物网站就可以,顺着菜单点开任意一个类别,比如如果你点击了手机类,所有手机的信息都出来了。

如果让你定义一个手机类,你会如何实现呢?
我们必须按照这个格式:

class是关键字,类名根据需求自己起名,比如电脑类就是:Computer,手机类就是:Phone等
重点强调一下格式

class Phone:
pass # pass也是关键字,表示占位符。一个完整的类里面是有东西的,否则结构就“坍塌”即有误了。 这就是一个手机类。但是这个手机类少了些东西。第一手机的特征要描述出来,其次手机能做什么也没有。这不算一个完整的类。
一个完整的类结构是需要有:用来表示特征的属性和表示动作的方法。
手机有什么特征呢?品牌、颜色、型号、价格、屏幕大小... 我们要在类中描述出来。
class Phone:
# 当然属性也可以不赋值,比如是None或者0,这里的是类属性
brand = '华为'
color = '黑色'
type = 'Mate30'
price = 3999 但是手机的功能还没有体现出来,手机能做什么能打电话、发信息、...,所以还要添加方法,方法即动作。方法定义同我们函数的定义,但是也有不同。【注意方法的参数位置的self】
class Phone:
# 当然属性也可以不赋值,比如是None或者0
brand = '华为'
color = '黑色'
type = 'Mate30'
price = 3999
def call(self):
print('可以打电话!')
def send_message(self):
print('可以发信息!') 好了!一个类的完整结构就完成了。我们再来定义一个类,比如赛亚人类:
class Saiya:
name = '悟空'
hair = '固定'
has_tail = True
appetite = '大'
def fight(self):
print('我们赛亚人就是喜欢战争!')
但是类定义了怎么用呢?前面我们提到过,类是一个统称,如果买手机你肯定不会说:我买手机,肯定是买手机类中的某一个手机。而这一个手机我们就称作对象。对象是具体的,类是抽象的。这个类就好比一个模具,造月饼的模具,通过这个模具可以造出很多的月饼,而我们吃到的月饼就是对象。

创建对象的方式:

故:
# 创建手机对象
phone1 = Phone()
phone2 = Phone()
phone3 = Phone()
# 三个不同的内存地址,所以创建一个对象就有一块自己的内存地址
print(phone1)
print(phone2)
print(phone3) 如何查看对象的属性和调用对象的动作呢?
通过对象名加点访问,这样的格式。

比如上面的手机对象调用
# 获取属性值
print(phone1.brand)
print(phone1.price)
#调用方法
phone1.call()
phone1.send_message( 再创建Saiya类对象,并调用一下方法
s1 = Saiya()
s2 = Saiya()
s3 = Saiya()
print(s1)
print(s2)
print(s3)
print(s1.has_tail)
s1.fight()
s2.fight()
# 观察
print(s1.name)
print(s2.name)
print(s3.name) 🤔️怎么打印出来的name都一样呢?

如果不希望他们访问类的属性,对象添加属性的方式有两种:
对象动态添加
在创建对象的时候,__init__添加
第一种添加方式:所谓对象动态添加就是在创建完对象之后,通过【对象.属性名=新值】的方式赋值。比如:手机类、赛亚人类(在原来代码基础上讲就行)
类的定义省略。。。。。使用原来的代码
# 创建手机对象
phone1 = Phone()
phone2 = Phone()
phone3 = Phone()
# 给phone1添加brand品牌,如果不设置获取的就是类中属性设置的品牌:华为
print(phone1.brand) # 先打印一下,然后修改,然后打印观察变化
phone1.brand= 'oppo'
phone1.price = 4999
print(phone1.brand)
# 同理是phone2,phone3也可以改变 同理赛亚人类也是如此
类的定义省略。。。。。使用原来的代码
s1 = Saiya()
s2 = Saiya()
s3 = Saiya()
# 改变s1的名字,可以互动一下,你们知道的龙珠中,是赛亚人的还有谁呢?
s1.name='贝吉塔'
print(s1.name)
s2.name = '巴达克'
print(s2.name) 第二种添加方式
利用魔术方法完成,最常用的用于实现属性初始化的方法是;__init__
所谓魔术方法就是无需调用,在某种场景下会自动触发的方法。其中 __init__就是,看一下他的使用
重新定义一个类比如我们熟悉的人类,
# 先不添加属性,看一下__init__的使用
class Person:
country = '中国'
# 定义__init__方法
def __init__(self):
print('我是一个__init__方法')
def eat(self):
print('我是吃货,每天各种美食吃吃喝喝真美!')
# 创建对象
p1 = Person() # 观察结果 可以看到有内容打印出来
p2 = Person() # 观察结果
print(p1)
print(p2) 可以看到创建对象就默认调用__init__,并没有显示的调用__init__。
在__init__中添加属性,
此处注意讲解self的作用,self表示对象自身,如何体现出来?在init中打印一下self对象观察是否是与原对象地址一致
强调如果init有参数在创建对象的时候必须加参数
class Person:
country = '中国'
# 定义__init__方法
def __init__(self,name):
print('我是一个__init__方法')
print(self)
self.name=name # 此时就相当于在self这个空间中存放了一个name属性
def eat(self):
print('我是吃货,每天各种美食吃吃喝喝真美!')
p = Person() # 此时报错,没有参数 注释掉
p = Person('龟仙人')
print(p.name)
p1 = Person('布尔玛')
print(p1.name)
# 大家可以看到对象调用name,名字不一样了
# 此处打印的结果也是一样的???????为什么???调用的都是eat方法,如果加以区分如何实现?
p.eat()
p1.eat() 可以在eat中饮用name属性,比如(修改Person的eat方法)
class Person:
country = '中国'
# 定义__init__方法
def __init__(self,name):
print('我是一个__init__方法')
print(self)
self.name=name
# 此处再次强调self,self表示对象,谁调用eat此时的self就是谁
def eat(self):
print(self.name + '是吃货,每天各种美食吃吃喝喝真美!')
p = Person('龟仙人')
p1 = Person('布尔玛')
p.eat()
p1.eat() 此时打印的结果就不一样了。
如果再加一个方法呢?在这个方法中我们介绍下带参数的方法定义
class Person:
country = '中国'
# 定义__init__方法
def __init__(self,name):
print('我是一个__init__方法')
print(self)
self.name=name
# 此处再次强调self,self表示对象,谁调用eat此时的self就是谁
def eat(self):
print(self.name + '是吃货,每天各种美食吃吃喝喝真美!')
# 当然方法中也可以有更多的语句
def sport(self,time):
if time<6:
print(self.name+'你太勤快了,起这么早去练功了啦!赞')
else:
print('怎么这么爱偷懒呢?还不抓紧时间练功去!哼!')
p = Person('悟空')
p.eat()
p.sport(4)
p = Person('雅木茶')
p.sport(9) 也可以在sport中调用eat的,即
def sport(self,time):
if time<6:
print(self.name+'你太勤快了,起这么早去练功了啦!赞')
else:
print('怎么这么爱偷懒呢?还不抓紧时间练功去!哼!')
# 比如练完功了,吃饭去,注意使用eat
self.eat() 最后总结:
面向对象类与对象的使用步骤:


需要资料也可以关注微信公众号:Python专栏,事不宜迟,一起进步吧!
