Python 自学笔记(教程)(九)


对象的模板,得先有了类,我们才能制造各种“对象”,就像我们先有了产品图纸,才能制造各种产品一样

理解类最简单的方式:类是一个函数包,类中可以放置函数和变量,然后类中的函数可以很方便的使用类中的变量

那么类中如何放置函数和变量呢,我们用class语句来自定义一个类

# 语法:创建一个名为“ClassName”的类,类名一般首字母要大写,(): 不能丢   
class ClassName():
# 如定义一个名为'狗'的类,可以写成class Dog():
    # 规范:class语句后续的代码块要缩进  
    def function1():
    # 定义类中的函数1

既然类是一个函数包,所以一个类中可以放置一堆函数,比如:

class ClassName():
    def function1():
        print('报道!我是类A的第一个方法!')
    def function2():
        print('报道!我是类A的第二个方法!')
    def function3():
        print('报道!我是类A的第三个方法!')

而要使用类中的函数就可以使用类名.函数名()的方法实现,比如:

class ClassName():
    def function1():
        print('报道!我是ClassName的第一个方法!')
    def function2():
        print('报道!我是ClassName的第二个方法!')
    def function3():
        print('报道!我是ClassName的第三个方法!')

ClassName.function1()
ClassName.function2()
ClassName.function3()

屏幕打印:

报道!我是ClassName的第一个方法!
报道!我是ClassName的第二个方法!
报道!我是ClassName的第三个方法!

要在类中放一堆变量可以这样:

class ClassName():
    var1 = 100
    var2 = -5.83
    var3 = 'abc'

在类中被定义的变量被称为类的属性。使用类名.变量名的格式,可以把类中的属性的值提取出来,比如:

class ClassName():
    var1 = 100
    var2  = -5.83
    var3 = 'abc'

# 这里需要用print语句,才能把提取出的数值打印到屏幕上
print(ClassName.var1)
print(ClassName.var2)
print(ClassName.var3)

屏幕打印:

100
-5.83
abc

类中的属性(变量)也是能改变,使用类名.变量名的格式,可以让我们在类的外面,增加或修改类的属性,比如:

class ClassName():
    var1 = 100
    var2 = -5.83
    var3 = 'abc'

ClassName.var1 = 99
ClassName.var4 = '新增一个变量'

print(ClassName.var1)
print(ClassName.var4)

屏幕打印:

99
新增一个变量

当类中放置了函数和变量,类就有了方法和属性,我们可以把类属性打印出来,也可以调用类方法,比如:

class SmartRobot():
    bust = 33 # 胸围
    waistline = 44 # 腰围
    hipcircumference = 55 # 臀围
    # 以上为类属性
    
    def greet(): # 打招呼
        print('主人你好!')
    def actingcute(): # 卖萌
        print('主人,求抱抱!')
    def angry(): # 生气
        print('主人,我要报警了!')
    # 以上为类方法

# 把类的属性打印出来
print(SmartRobot.bust)
print(SmartRobot.waistline)
print(SmartRobot.hipcircumference)

# 调用类方法
SmartRobot.greet()
SmartRobot.actingcute()
SmartRobot.angry()

类方法也是函数,它和单独定义函数区别在于:它的调用格式:类.函数名()函数名()多了一个类.

更重要的是,“类”中的函数可以利用“类”中的变量(也就是类方法可以调用类属性),比如:

# 请直接运行体验代码

class ClassName():
    var1 = 100
    var2 = 200

    @classmethod
    def function1(cls):
        print(cls.var1)
        print(cls.var2)

ClassName.function1()

屏幕打印:

100
200

这里新出现的@classmethod是声明了下面的函数是类方法,为了把类中的变量传递给类中的函数,我们需要用到3个特定格式:

@classmethod
# @classmethod 的中文意思就是“类方法”,@classmethod 声明了 function1 是类方法,这样才能允许 function1 使用类属性中的数据

cls
# cls 的意思是 class 的缩写,如果类方法 function1 想使用类属性(也就是类中的变量),就要写上 cls 为 function1 的第一个参数,也就是把这个类作为参数传给自己,这样就能被允许使用类中的数据

cls.var
# cls.var,类方法想使用类属性的时候,需要在这些变量名称前加上 cls.

以上三种特定格式,但凡有任何格式错误都会报错,比如:

  • 缺了“@classmethod”,类方法就不能直接利用类中的属性,于是报错

TypeError: function1() missing 1 required positional argument: ‘cls’

  • 缺了clscls.var,类方法没有和“类”沟通好数据对接,所以不能得到“类”中属性的数据,也会报错

TypeError: function1() takes 0 positional arguments but 1 was given

  • 当类中的函数不需要用到类中的变量时,就不要用@classmethodclscls.三处格式,否则终端也会给你报错
# 请运行代码,报错后,修改格式到正确的样式就能运行通过

class ClassName():
    var1 = 100
    var2 = 200
    
    @classmethod
    def function1():
        print('我不需要使用类属性。')

ClassName.function1()

报错:

TypeError: function1() takes 0 positional arguments but 1 was given

class SmartRobot():
    bust = 33
    waistline = 44
    hipcircumference = 55
    
    def greet():
        print('主人你好!')
    
    def actingcute():
        print('主人,求抱抱!')
    
    def angry():
        print('主人,我要报警了!')
        
    @classmethod
    def autosay(cls):
        print('主人,我的三围是:')
        print('胸围:' + str(cls.bust))
        print('腰围:' + str(cls.waistline))
        print('臀围:' + str(cls.hipcircumference))
        print('哈哈哈哈哈,下面粗上面细,我长得像个圆锥。')

SmartRobot.autosay()

屏幕打印:

主人,我的三围是:
胸围:33
腰围:44
臀围:55
哈哈哈哈哈,下面粗上面细,我长得像个圆锥。

更多推荐

Python 自学笔记(教程)(九)