Python指导手册这么写:类提供了把数据和功能绑定在一起的方法。创建新类时创建了新的对象类型,从而能够创建该类型的新实例。实例具有能维持自身状态的属性,还具有能修改自身状态的方法。本节就来讲讲如何定义类。
P 类的定义
(1)定义与实例化
类的定义使用关键字class,格式如下:
代码解释:
第一行,class类定义关键字,空格后接类名称和圆括号,圆括号内填写继承那个类(可以为空,表示继承基类),最后是冒号换行。
第二行,类的成员变量name,并赋初始值为"Rose"。
第三行,定义一个类的方法(跟函数定义类似),但注意它的第一个参数必须是self。
第四行,类方法调用类变量,并将name赋值给类变量name。类内的成员变量,是在类内调用的,只需要使用self.成员变量名即可(不像函数需要使用global、nonlocal关键字才能访问外部空间变量)。
第五行,是类方法的返回值。该返回值在类实例化调用时,作为方法输出。
上面介绍的是类的定义,但在实际中我们需要对类进行实例化后才能使用类。使用方法如下:
代码解释:
第一行,通过mycls()完成了类的实例化,并赋值给变量stu。
第二行,使用类的.setName()方法,修改类的name属性为Tom。
第三行,实例化类stu的name属性。
代码演示:
class mycls(): name='Rose' def setName(self,name): self.name = name return 1stu = mycls()print(stu.name) # 输出:"Rose"stu.setName('Tom')print(stu.name) # 输出:"Tom"
(2)类属性
类的数据部分称为属性或成员变量。可分为公有变量、私有变量。公有变量可以通过".varname"方式访问,而私有变量则无法访问。Python中的私有变量固定以两个下划线开头,如下:
class mycls(): __name='Rose' def setName(self,name): self.__name = name return 1stu = mycls()print(stu.__name)# 输出错误信息,如下: Traceback (most recent call last): Cell In[17], line 8 print(stu.__name)AttributeError: 'mycls' object has no attribute '__name'
可以看到,通过".varname"方式无法读取到类中的私有变量。这里要特别特别说明:Python的私有变量是一个实际是一个伪命题,它仅仅是将该变量改名为_classname__varname格式,如下就可以正常输出了:
print(stu._mycls__name)# 输出 'Rose'
该方式,只是解释下Python中的公有、私有变量的差异,实际只需要掌握的是类属性的使用。
(3)类方法
通常,我们可以自定义类方法。前文,已经在类定义中实现了自定义类,现在来了解下特殊的方法——魔术方法,这些方法主要用于增强类功能。魔术方法固定采用双下划线开始和双下划线结束的方式定义,如下:
__init__()方法用于在类实例化时的操作。如下:
# 定义一个类class mycls(): def __init__(self): self.name = 'Rose'# 实例化并调用 stu = mycls()print(stu.name)# 输出 :'Rose'
这种定义,跟之前没什么不同,只是变量写在了__init__()方法下。现在,我改成如下形式:# 定义一个类class mycls(): def __init__(self,name): self.name = name# 实例化并调用 stu = mycls('Tom')print(stu.name)# 输出 :'Tom'
经过修改,在类的实例化时,就给其添加了一个名字“Tom”,这样,就可以在类实例化时就给其赋上固定的名字了。__str__()方法用于返回类实例字符串。如下:
class mycls(): def __init__(self): self.name = 'Rose'stu = mycls()print(stu)# 输出如下:<__main__.mycls object at 0x000002222A02C690>
而使用__str__()方法,则可以返回指定的字符串,如下:
class mycls(): def __str__(self): return 'MyClass'stu = mycls()print(stu)# 输出如下:MyClass
__call__()方法用于调用类实例时触发相应操作。如下:
class mycls(): def __call__(self): print('hello')stu = mycls()stu()# 输出:'hello'
若没有定义__call__()方法,则会出现如下错误:class mycls(): def __str__(self): return 'MyClass'stu = mycls()stu()# 输出:Traceback (most recent call last): Cell In[38], line 1 stu()TypeError: 'mycls' object is not callable
该方法主要用于可能发生类实例直接调用的情况。上述介绍了__init__()、__str__()、__call__()三个魔术方法。在Python中还有很多魔术方法,有兴趣的小伙伴要多研究。-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。