目录
一、类的组成
二、静态类
三、动态类
学习类的时候首先要先了解下什么是面向对象编程,面向对象编程,简称OOP,是一种程序的设计思路,面向对象重要的概念就是类和实例,类是抽象的模板,实例就是类的具体对象。
编程中除了有面向对象编程还有面向过程编程,两个区别可以想下古代的成活字印刷,面向过程可以理解为我有文章需要打印,然后搞一个模板出来,但是其中有一个字错了我就又要弄一个新的模板出来,使用起来不灵活,只是为了完成当前的任务,没有可扩展性,但是面向对象呢,你需要打印什么,我就按照你需要的东西给你组合排列就好,如果其中有个错误,我就直接换一个字就行了,如果要加字,不用再去弄一个新的模板,直接加上就行,这样一对比,活字印刷的扩展性、灵活性等特点就体现出来了。
然后说下类,类可以理解成是用来描述相同的属性和方法的对象的合集,他定义了该集合中每个对象所共有的属性和方法,类的出现使得大家开发的更加的便捷,并且类具有代码复用性、可扩展性、可继承、多态性等特点。
类可分为静态类与动态类,其中的关键区别就是静态类没有self关键字(因为self是默认的,也可以写成别的参数,所以判断依据可以看函数后的()里有没有自定义参数),也就是不能被实例化,也并且静态类不支持__int__初始化函数。
类的组成由以下内容构成:
(1)class关键字
所有的类定义必须用class开始,就和函数必须用def开始一样
(2)类名
自定义类名的取名参考函数的取名,类名通常是大写开头的单词
(3)类的第一行格式
class 类名(): ()可以存在,也可以为空,如果有可以继承的类,在()里填入类名
(4)类文档说明
用三个单引号(""")成对引用说明内容 可存在可不存在
(5)类函数
类函数在类里或者实例里又叫方法。例子中的go_home()、eat_dumpling()、fangpao()、bainian()在类里又可以被叫做方法
(6)__int__和self
__int__和slef出现在动态类中,__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。self 代表的是类的实例,这个名称也可以被自定义为其他名字,__init__
方法的第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。
可以看个例子:
class New_Year(): #定义一个类 New_Year()
'''创建一个新年的类''' #说明文档 注意缩进
def go_home(): #定义一个方法 go_home(回家)
print("不用隔离,可以回家了!!!") #输出为 "不用隔离,可以回家了!!!"
def eat_dumpling(): #定义一个方法 eat_dumpling(吃饺子)
print("真好吃,吃饱了!!!") #输出为 "真好吃,吃饱了!!!"
def fangpao(): #定义一个方法(函数在类里可以被叫做方法)fangpao(放炮)
print("噼里啪啦") #输出为 "噼里啪啦"
def bainian(): #定义一个方法bainian(拜年)
print("刘阿童木祝大家新年快乐!!!") #输出为 "刘阿童木祝大家新年快乐!!!"
New_Year.go_home() #调用go_home()方法打印结果
Tiger_year = New_Year() #尝试给New_year一个实例Tiger_Year
Tiger_year.fangpao() #报错了 因为这属于一个静态函数 不能被实例化
打印结果为:TypeError: fangpao() takes 0 positional arguments but 1 was given
不用隔离,可以回家了!!!
上面就是一个静态类,把新年定义了一个类,在新年这个类里加上了,回家、吃饺子、放炮、拜年多个方法
动态类对比静态类是可以创建实例的,很明显的区别就是在函数后的()里有参数,可以把实例理解成把类给重新赋值定义了一个值,这个就是实例化,这个变量就是实例,对一个类来说可以赋值成多个实例,每个实例里的值都互不干扰,实例主要是由属性和方法构成。在下面例子中,__int__方法里的内容,就可以称作为属性,而下面的其他参数就可以称作为方法。有了__init__
方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__
方法匹配的参数,self
不需要传。
看下这个例子:
class Game(): #定义一个Game的类
def __init__(self,name,sex,age,fight): #定义一个保留函数__int__()name、sex、age、fight
self.name = name #定义属性变量 name
self.sex = sex #定义属性变量 sex
self.age = age #定义属性变量 age
self.fight = fight #定义属性变量 fight
def land(self): #定义一个方法land
"""陆地训练 战斗力+200"""
self.fight = self.fight - 200 #战斗力减200
def sky(self): #定义一个方法sky
"""天空训练 战斗力+100"""
self.fight = self.fight + 100 #战斗力加100
def sea(self): #定义一个方法 sea
"""海里训练 战斗力+300"""
self.fight = self.fight +300 #战斗力加300
def xinxi(self): #定义一个方法 信息
temp = "姓名:%s ; 性别:%s ; 年龄:%s ; 战斗力:%s" % (self.name, self.sex, self.age, self.fight) #获取当前状态
print(temp) #打印当前状态
"""创建一个实例Atom"""
Atom = Game("Atom","机器人",102,500) #通过Game类赋值建议对应的一个实例 Atom
Atom.sky() #通过实例调用方法sky
Atom.sky() #通过实例调用方法sky
Atom.xinxi() #打印当前状态 结果为:姓名:Atom ; 性别:机器人 ; 年龄:102 ; 战斗力:700
"""创建一个实例Tiga"""
Tiga = Game("Tiga","奥特曼",300,800) #通过Game类赋值建议对应的一个实例 Tiga
Tiga.sky() #通过实例调用方法sky
Tiga.sea() #通过实例调用方法sky
Tiga.xinxi() #打印当前状态 结果为:姓名:Tiga ; 种类:奥特曼 ; 年龄:300 ; 战斗力:1200
在这个例子中,类就是Game(),实例就是Atom和Tiga,实例之间都是相互独立的,在实例里调用的函数一律称作为方法,而在类里可以叫做方法或者函数都可以。类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称。
那如果在类中只有个别函数带self可以被实例化调用吗?
class New_Year(): #定义一个类 New_Year()
def go_home(self): #定义一个方法 go_home(回家)
print("不用隔离,可以回家了!!!") #输出为 "不用隔离,可以回家了!!!"
def eat_dumpling(): #定义一个方法 eat_dumpling(吃饺子)
print("真好吃,吃饱了!!!") #输出为 "真好吃,吃饱了!!!"
def fangpao(self): #定义一个方法(函数在类里可以被叫做方法)fangpao(放炮)
print("噼里啪啦") #输出为 "噼里啪啦"
def bainian(): #定义一个方法bainian(拜年)
print("刘阿童木祝大家新年快乐!!!") #输出为 "刘阿童木祝大家新年快乐!!!"
New_Year.go_home() #打印结果为 报错:TypeError: go_home() missing 1 required positional argument: 'self'
Tiger_year = New_Year() #给New_year一个实例Tiger_Year
Tiger_year.fangpao() #打印结果为 噼里啪啦
这样就能可以看出,当函数带self时,可以被实例化调用(参考fangpao()的方法),但是不能直接调用该方法(参考go_home()的方法)
下图为公众号二维码,内容会同步发出,大家可以关注一起学习
这个是张狗子小哥哥的公众号,会分享一些平时的工作心得,可以关注看下。