Python基础6--类1(静态类与动态类)

目录

一、类的组成

二、静态类

三、动态类


         学习类的时候首先要先了解下什么是面向对象编程,面向对象编程,简称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()的方法)


  下图为公众号二维码,内容会同步发出,大家可以关注一起学习

                                                                                               

这个是张狗子小哥哥的公众号,会分享一些平时的工作心得,可以关注看下。

                                ​​​​​​​        ​​​​​​​                                                        

你可能感兴趣的:(python入门,python)