python的类,用类创建一个精通算术并能展示肖像的人
python的类是什么
我们该如何给python的类来下一个通俗易懂的定义呢?据个人经验和总结,认为python的类是一个容器,封装了那些用来描述现实生活中的事物(对象)及其各种各样的特征属性、行为方式的python代码封装起来。
python类的基本结构
class ClassName (ParentClassList):
pass
类的基本结构解析
- 类用关键词class来定义;
- ClassName为类名,约定俗成的命名方式是驼峰式的,即每一个单词的首字母大写;
- ParentClassList为父类列表,用英文的括号“()”括起来——python的类可以采用继承的机制(继承和多态后面的章节会介绍);
- 若是ParentClassList为空,也就是括号里头没有内容,则该类默认继承object类,注意,object类是所有类的基类;
- 括号后面必须跟随冒号“:”,否则会抛出错误;
- pass部分为类所封装的我们所要抽象的现实中的“事物”的属性特征、行为方式等,注意严格的缩进。
用python类创建一个精通算数并展示肖像的人
上一节中,我们在打怪的游戏当中创建了一个NPC的类,并默认继承object类,这节当中,我们来设计一个更能展示的类特性的类程序,同样默认继承object类。代码如下:
from PIL import Image #导入用于打开图片的库
import time
class Person():
id_address = '地球' #类变量
def __init__(self, name, ID, portraitpath): #类实例的初始化
self.name = name #实例变量
self.ID = ID
self.portrait = Image.open(portraitpath)
def arithmetic(self, a,b,c): #类实例方法
print('%s精通加减乘除的算术'%self.name)
time.sleep(1)
if b == '+':
print('%s + %s' %(a,c))
time.sleep(1)
print('=%s' %(a+c))
elif b == '-':
print('%s - %s' %(a,c))
time.sleep(1)
print('=%s' %(a-c))
elif b == '*':
print('%s x %s' %(a,c))
time.sleep(1)
print('=%s' %(a*c))
elif b == '/':
print('%s ÷ %s' %(a,c))
time.sleep(1)
print('=%s' %(a/c))
@classmethod #类方法,注意参数和类实例方法的参数的区别
def person_func(cls):
print('人类居住在%s' %cls.id_address)
@staticmethod #类的静态方法,注意参数
def plant_atrr():
print('植物可以光合作用,与人类不同!')
xiaopeng = Person('小彭','123456789','/path/pengyuyan.jpg') #类的实例化,其中的path可以用绝对路径
xiaohu = Person('小胡','213456789', '/path/huge.jpg')
print(xiaopeng.name)
print(xiaohu.name)
print(xiaopeng.id_address) #分别通过类的实例xiaopeng和xiaohu的来调用类变量id_address
print(xiaohu.id_address)
xiaopeng.portrait.show()
xiaopeng.arithmetic(1,'/',5)
xiaohu.arithmetic(1,'/',5)
Person.person_func() #调用
Person.plant_atrr()
————————————————————————————————————————
代码输出:
小彭
小胡
地球
地球
图片(计算机会利用操作系统默认的图片预览工具弹出图片,而不是在终端输出)
小彭精通加减乘除的算术
1 ÷ 5
=0.2
小胡精通加减乘除的算术
1 ÷ 5
=0.2
人类居住在地球
植物可以光合作用,与人类不同!
实例代码解析
如上代码,我们需要注意几个概念,分别是类变量、实例变量、初始化函数、类实例方法、类方法、静态方法,下面我们将一一解析:
- 类变量:注意上面的注释中,我们分别用了两个不同的类实例xiaopeng和xiaohu来调用id_address,输出的内容都是“地球”,由此说明类变量是类的所有实例都具备的属性;
- 实例变量:注意上面注释内容中初始化函数底下的self.name及其他的,就是实例变量,会根据类实例化的时候传递的不同参数而发生变化,就像上面xiaopeng.name和xiaohu.name会输出不同的名字;
- 初始化函数:上面的代码中,我们用xiaopeng = Person('小彭'...)来进行类的实例化,并赋值给变量xiaopeng,该过程就像我们新建word文档并保存一样,创建了一个Person“文件”(实例),并通过__init__()函数进行初始化,就相当于调用了一个函数来声明self.name、self.ID等变量;
- 类实例方法:创建类的实例方法跟创建python的其他函数基本一样,不同的是参数不同,必须传递self参数,就是传递类对象本身,可以理解为这样做的目的就是为了将类实例方法跟类实例进行绑定,称为一体,就像人精通算术是人的属性,是跟人一体的;
- 类方法:我们可以注意到,调用类方法和调用类的实例方法是不同的,创建类方法必须用@classmethod来装饰,并传递一个cls参数,相当于self;类方法就相当于类的方法,跟类实例没太大关系,不信的话,大家可以在类实例化之前,用Person调用person_func()类方法,一样可以调用;
- 类的静态方法:通过上面代码中,我们定义的类的静态方法,我们可以了解到静态方法的函数除了需要用@staticmethod来装饰之外,跟创建其他的python函数没什么两样,可以传递参数,也可以不传递,可以理解为该方法跟类和实例都没太大关系,调用方法跟类方法类似。
好了,python的类就先介绍到这里,下一章节我们将继续介绍python类的继承和多态。