温馨提示:手机观看时,代码块可以左右滑动
Python的面向对象
Python的类
在这门语言中,类使用 class 语句来定义。在类中包含了一系列语句,比如赋值语句,def 定义函数等。从面向对象的角度看,类封装了对象的行为和数据。在Python的类中变量就是对象的数据,函数就是对象的行为,函数也成为方法。
Python中的对象
在Python的对象模型中,有两种对象:类对象和实例对象。类对象是用 class 语句创建的,而实例对象是在调用类的时候创建的。所以类对象只有一个,而实例对象可以有多个。
类对象
- 执行 class 语句创建一个类对象和一个变量;
- 类中的赋值语句创建的变量是类的数据属性,在类中的顶层赋值语句创建的变量才属于类属性;
- 类中定义的 def 语句的函数是类的方法属性;
- 类的数据和方法和所有实例对象共享。
实例对象
- 实例对象通过调用类对象来创建;
- 每个实例对象继承类对象的属性,并获得自己的命名空间;
- 实例对象可以拥有“私有”属性。类的方法函数的第一个参数默认为 self,表示引用方法的对象实例。在方法中地域 self 的属性赋值才会创建术语实例对象的属性
[^]: 摘自《python3基础教程》侵删 。这个是本文作者看了诸多教材后,从中对比出最简单理解的一版。肯定还是很枯燥,但如果是零基础的读者还是要硬着头皮看完再看后面的内容。
定义类
基本格式如下代码:
class Student: #创建了一个名为Student的类,我们约定类的首字母大写。
data = 200 #在此,我们定义了类的属性.
def set_name(self,name): #用def语句定义了类的方法
self.name = name
def show_name(self):
return self.name
print("类Student创建完成")
调用类
type(Student) #首先我们检查一下我们类的类型,返回type
Student.data #调用了类的属性,返回200
Student.set_name() #试图调用类的方法,会直接报错。类的方法并不能直接调用,只能通过实例对象调用。
#正确调用类方法的姿势如下:
banji1 = Student() #创建一个实例对象banji1
banji1.set_name("amy") #传入参数
banji1.show_name() #调用方法,显示实例对象属性值,返回'amy'
banji2 = Student() #创建另一个实例对象banji2
banji2.set_name('tom') #传入参数
banji2.show_name() #调用方法,显示实例对象属性值,返回'tom'。从这可看出,实例对象属性之间没有什么关系。
banji1.data,banji2.data #返回(200, 200),访问了共享属性
对象的属性
在Python中,实例对象继承了类对象的所有属性和方法,可以用dir()函数查看
dir(Student)
dir(banji1)
#这个代码返回信息太长,可以自行运行查看一下。以双下划綫开头结尾的变量名术语内置属性,最后我们可以看到来自Student类对象的data、set_name、show_name三个属性。
共享属性
类对象的数据属性是全局的,改变类对象的属性,实例对象引用时也会被改变。实例对象的数据属性更改不影响其他实例对象或者类对象。
banji3 = Student() #创建Student的实例对象,并用banji3引用该对象
banji4 = Student() #创建Student的实例对象,并用banji4引用该对象
print(Student.data,banji3.data,banji4.data) #返回200 200 200
Student.data = 100 #改变全局变量属性
print(Student.data,banji3.data,banji4.data) #返回100 100 100,实例对象属性跟随改变
banji3.data = 400 #更改实例变量的data属性赋值
print(Student.data,banji3.data,banji4.data) #返回100 400 100,实例对象属性改变,不影响他人
实例对象可以拥有私有属性
“私有”强调属性只属于当前实例对象,对其他实例对象是不可见的。
banji5 = Student() #创建Student的实例对象,并用banji5引用该对象
# banji5.set_name() #试图访问实例对象的属性,结果报错显示并不存在
banji5.set_name("john") #调用类的对象方法为属性赋值
banji5.show_name() #返回"john"
类的私有属性
如果想要类的方法或者属性成为私有的,不能通过实例对象引用,只需要在期名称以两个下划线开头即可。如下例:
class Secret:
def __invisible(self):
print("you can't see")
def visible(self):
print("what you can not see is:")
self.__invisible()
#这样创建,我们就不能从外部访问__invisible,但是可以通过invisible访问
s = Secret()
# s.__invisible() #试图从外部访问,直接报错
s.visible() #访问成功,返回what you can not see is: you can't see
#其实,在类定义中,所有以两下划线开头的名称都被进行了转化,就是加了个下划线和类名
dir(Secret) #用dir查看,我们发现列表中有'_Secret__invisible',知道这个以后,我们可以从外部访问类的私有对象了
s._Secret__invisible() #成功返回you can't see。但这中操作并不正规
魔法函数init
又名构造函数,在调用类创建实例对象时自动被调用,不需要手动调用。
class Boy(object):
def __init__(self):
#方法,用来做变量初始化或赋值操作,在类实例化对象的时候,会被自动调用
self.name = "yyg"
self.height = "180"
self.weight = "170"
def info(self):
print("我叫{},身高{},体重{}".format(self.name,self.height,self.weight))
def show(self):
"""实例方法"""
print("你的嘤嘤怪以上线")
boyfriend = Boy()
# 只需要调用实例方法info(),即可获取数据
boyfriend.info() #返回我叫yyg,身高180,体重170
boyfriend.show() #返回你的嘤嘤怪以上线