Python Class 类详解:定义、继承与特殊方法的使用
文章目录
- Python Class 类详解:定义、继承与特殊方法的使用
- 一 定义类 class
- 二 class 的功能
- 三 继承
- 1 未有继承之前
- 2 有继承之后
- 四 私有属性和功能
- 五 特殊方法
- 六 完整文件示例
- 七 源码地址
本文深入介绍了 Python 中类的定义与使用方法,涵盖了类的基本概念、实例化、继承以及私有属性的应用。文章通过实例展示了如何将属性和方法封装在类中,并通过 __init__
方法初始化类的实例。还探讨了类的继承机制,展示了如何通过继承减少重复代码。除此之外,文中讨论了私有变量与方法的使用场景,以及特殊方法如 __add__
、__sub__
等的重载,实现了运算符的自定义功能。本文为你提供了一个完整的类使用指南,帮助你在 Python 中高效地组织和管理代码。
一 定义类 class
类的写法首字母大写。
class File:# __init__() 在类实例化时触发一次 __init__ 功能,它可以用来初始化配置def __init__(self):# self 获取这个类的自己的属性或功能时使用它self.name = "f1"self.create_time = "today"
init() 在类实例化时触发一次 init 功能,它可以用来初始化配置;self 获取这个类的自己的属性或功能时使用它。
二 class 的功能
把一类相同事物的函数方法封装到一起。
# 类似 Function 函数功能 可以给 __init__() 加上入参,在初始化时传入参数
class File01:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_time# 一个类中可以定义多个方法def change_name(self, new_name):# 修改这个类中的属性,使用 self 调用 name 并修改属性self.name = new_name# 定义一个有返回的函数,在类中定义函数 需要加上 selfdef get_info(self):return self.name + " is created at " + self.create_time
一个类中可以定义多个方法,定义一个有返回的函数,在类中定义 Function 函数 需要加上 self。
三 继承
1 未有继承之前
class Video:def __init__(self, name, window_size=(1080, 720)):self.name = nameself.window_size = window_sizeself.create_time = "today"class Text:def __init__(self, name, language="zh-cn"):self.name = nameself.language = languageself.create_time = "today"
Video 和 Text 中有共同的属性,是不是可以减少共有属性/功能的重复开发,是可以的,使用继承。
2 有继承之后
# 继承示例
class File02:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_timedef get_info(self):return self.name + "is created at" + self.create_timeclass Video02(File02): # 继承了 File 的属性和功能def __init__(self, name, window_size=(1080, 720)):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.window_size = window_sizeclass Text02(File02): # 继承了 File 的属性和功能def __init__(self, name, language="zh-cn"):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.language = language# 也可以在子类里复用父类功能def get_more_info(self):return self.get_info() + ", using language of " + self.language
这里继承的是类 File02。
四 私有属性和功能
class File03:def __init__(self):self.name = "f1"self.__deleted = False # 我不让别人用这个变量self._type = "txt" # 我不想别人使用这个变量def delete(self):self.__force_delete()# 私用变量无法访问,只能内部访问def __force_delete(self): # 我不让别人使用这个功能self.__deleted = Truereturn True# 不建议直接访问def _soft_delete(self): # 我不想让别人使用这个功能return self.__force_delete() # 我自己可以在内部随便调用# 可以这样访问def delete_self(self):return self._soft_delete()
私有属性的特点
私有 | 特点 |
---|---|
_ 一个下划线开头 | 弱隐藏 不想让别人用 (别人在必要情况下还是可以用的) |
__ 两个下划线开头 | 强隐藏 不让别人用 |
注意:
1)”_
“ 是私有的,一般不应该被调用
2)”__
“ 是为了避免子类重写某个函数而使用的
3)”__xx__
“ 一般是用于Python调用
五 特殊方法
特殊方法,__xx__
前后双下划线,这种方法被称为魔术方法,一般是系统定义名字,类似于__init__()
,它是给Python调用的。
定义 | 含义 |
---|---|
def __init__() | 初始化实例 |
def __repr__() | 字符串的“官方”表现形式 |
def __str__() | 字符串的“非正式”值 |
def __iter__() | 遍历某个序列 |
def __next__() | 从迭代器中获取下一个值 |
示例
class WrongMethod(object):def __init__(self, n):self.n = n# 重载加法运算符 (__add__ 方法) 它不执行标准的 Python 加法def __add__(self, other):return self.n - other# 重载减法运算符 (__sub__ 方法) 它不执行标准的 Python 减法def __sub__(self, other):return self.n + otherdef __str__(self):return str(self.n)
六 完整文件示例
# This is a sample Python script.# Press ⌃R to execute it or replace it with your code.
# Press Double ⇧ to search everywhere for classes, files, tool windows, actions, and settings.def print_hi(name):# Use a breakpoint in the code line below to debug your script.print(f'Hi, {name}') # Press ⌘F8 to toggle the breakpoint.# 定义 class
class File:# __init__() 在类实例化时触发一次 __init__ 功能,它可以用来初始化配置def __init__(self):# self 获取这个类的自己的属性或功能时使用它self.name = "f1"self.create_time = "today"# class 的功能
# 类似函数功能 可以给 __init__() 加上入参,在初始化时传入参数
class File01:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_time# 一个类中可以定义多个方法def change_name(self, new_name):# 修改这个类中的属性,使用 self 调用 name 并修改属性self.name = new_name# 定义一个有返回的函数,在类中定义函数 需要加上 selfdef get_info(self):return self.name + " is created at " + self.create_time# 继承
class Video:def __init__(self, name, window_size=(1080, 720)):self.name = nameself.window_size = window_sizeself.create_time = "today"class Text:def __init__(self, name, language="zh-cn"):self.name = nameself.language = languageself.create_time = "today"# Video 和 Text 中有共同的属性,是不是可以减少共有属性/功能的重复开发——继承# 继承示例
class File02:def __init__(self, name, create_time="today"):self.name = nameself.create_time = create_timedef get_info(self):return self.name + "is created at" + self.create_timeclass Video02(File02): # 继承了 File 的属性和功能def __init__(self, name, window_size=(1080, 720)):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.window_size = window_sizeclass Text02(File02): # 继承了 File 的属性和功能def __init__(self, name, language="zh-cn"):# 将共用属性的设置导入 File 父类super().__init__(name=name, create_time="today")self.language = language# 也可以在子类里复用父类功能def get_more_info(self):return self.get_info() + ", using language of " + self.language# 私有属性和功能
class File03:def __init__(self):self.name = "f1"self.__deleted = False # 我不让别人用这个变量self._type = "txt" # 我不想别人使用这个变量def delete(self):self.__force_delete()# 私用变量无法访问,只能内部访问def __force_delete(self): # 我不让别人使用这个功能self.__deleted = Truereturn True# 不建议直接访问def _soft_delete(self): # 我不想让别人使用这个功能return self.__force_delete() # 我自己可以在内部随便调用# 可以这样访问def delete_self(self):return self._soft_delete()# 私有 特点# _ 一个下划线开头 弱隐藏 不想让别人用 (别人在必要情况下还是可以用的)# __ 两个下划线开头 强隐藏 不让别人用# 特殊方法,"__xx__" 前后双下划线,这种方法被称为魔术方法,一般是系统定义名字,类似于__init__(),一般是给Python调用的。# 定义 含义# def __init__() 初始化实例# def __repr__() 字符串的“官方”表现形式# def __str__() 字符串的“非正式”值# def __iter__() 遍历某个序列# def __next__() 从迭代器中获取下一个值# ”_“ 是私有的,一般不应该被调用# ”__“ 是为了避免子类重写某个函数而使用的# ”__xx__“ 一般是用于Python调用class WrongMethod(object):def __init__(self, n):self.n = n# 重载加法运算符 (__add__ 方法) 它不执行标准的 Python 加法def __add__(self, other):return self.n - other# 重载减法运算符 (__sub__ 方法) 它不执行标准的 Python 减法def __sub__(self, other):return self.n + otherdef __str__(self):return str(self.n)# Press the green button in the gutter to run the script.
if __name__ == '__main__':print_hi('Class 类')# See PyCharm help at https://www.jetbrains.com/help/pycharm/# 类的实例化和调用my_file = File()print(my_file.name)print(my_file.create_time)print()# 修改类的属性my_file.name = "new_name"print(my_file.name)print()# 在初始化时传入参数my_file01 = File01("my_file01")print(my_file01.name)print(my_file01.create_time)# 函数无参数返回时,会打印 Noneprint(my_file01.change_name("new_name"))print(my_file01.name)print()print(my_file01.get_info())print()v02 = Video02("my_video")t02 = Text02("my_text")print(v02.get_info()) # 调用父类的功能print(t02.create_time) # 调用父类的属性print(t02.language) # 调用自己的属性print(t02.get_more_info()) # 调用自己加工父类的功能print()f03 = File03()print(f03._type) # 可以拿到值,但是这个类的作者不想让你直接这样拿到print(f03._soft_delete()) # 可以调用,但是这个类的作者不想让你直接调用print(f03.delete_self())# 接下来的两个实验都会报错# f03.__force_delete()num = WrongMethod(20)print("num = ", num)# 这里返回的答案时错误的,是重载之后重新定义的方法print("num + 10 = ", num + 10)# 这里返回的答案时错误的,是重载之后重新定义的方法print("num - 10 = ", num - 10)# - 在`__add__`方法中,实际执行的是减法操作。# - 在`__sub__`方法中,实际执行的是加法操作。# 这种实现虽然在功能上是有效的,但可能会引起阅读和使用代码的人的困惑,因为它违背了常规的期望和实践。通常,我们期望# `__add__`和`__sub__`分别实现标准的加法和减法行为。
复制粘贴并覆盖到你的 main.py 中运行,运行结果如下。
Hi, Class 类
f1
todaynew_namemy_file01
today
None
new_namenew_name is created at todaymy_videois created attoday
today
zh-cn
my_textis created attoday, using language of zh-cntxt
True
True
num = 20
num + 10 = 10
num - 10 = 30
七 源码地址
代码地址:
国内看 Gitee 之 Class 类.py
国外看 GitHub 之 Class 类.py
引用 莫烦 Python