类
类
1. 创建和使用类
1. 创建类
class 类名:
"""文档字符串"""
- 类名的命名首字母要大写
-
魔术方法:
__init__()
--- 当类实例的时候会自动执行调用方法体内的代码-
class Dog: """"狗""" def __init__(self, name, age): self.name = name self.age = age def sit(self): """"模拟小狗坐下""" print(f"{self.name} is now sitting")
-
__init()__
方法中形参self
是必不可少的, 而起必须位于其他形参的前边, 因为Python调用这个方法来创建Dog实例时,将自动传入实参self
。每个与实例相关联的方法调用都自动传递实参se1f
,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。创建Dog实例时,Python将调用Dog类的方法_init_()
。我们将过实参向Dog()
传递名字和年龄,self
会自动传递,因此不需要传递它。每当根据Dog类创建实例时,都只需给最后两个形参(name和age)提供值。 -
在
name
与age
前边都有前缀self
, 以self
为前缀的变量可供类中的所有方法使用,可以通过类的任何实例来访问 -
在定义类的方法的时候都要加上
slef
这个形参
-
2. 根据类创建实例
变量名 = 类名(形参)
my_dog = Dog('bleak', 4)
-
访问属性
my_dog.name
- 句号表示法, 这种语法演示了Python是如何获取属性的值得, Python先找到实例my_dog在查找与该实例相关的属性name
-
调用方法
my_dog.sit()
2. 使用类和实例
1. 给属性指定的默认值
-
在方法
__init__()
中为属性指定默认值 -
class Dog: """"狗""" def __init__(self, name, age): """初始化""" self.name = 'pink self.age = 4 def sit(self): """"模拟小狗坐下""" print(f"{self.name} is now sitting")
2. 修改属性的值
-
通过实例化改变属性的值
-
这只会改变实例化的变量的属性值, 原类的属性值不会变
-
my_dog.name = 'withe'
-
-
通过方法改变属性值
-
在类中定义方法用其改变属性
-
class Dog: """"狗""" def __init__(self, name, age): """初始化""" self.name = 'pink self.age = 4 def update(self, new_name): """"定义方法来改变属性值""" self.name = new_name def sit(self): """"模拟小狗坐下""" print(f"{self.name} is now sitting")
-
之后还要通过实例化调用方法, 不过这样可以让类中的属性值也发生变化
-
3. 继承
class Dog:
""""狗"""
def __init__(self, name, age):
"""初始化"""
self.name = 'pink
self.age = 4
def sit(self):
""""模拟小狗坐下"""
print(f"{self.name} is now sitting")
class BigDog(Dog):
""""子类"""
def __init__(self, name, age):
""""初始化父类属性"""
super().__init__(name, age)
- 创建子类时, 父类必须包含在当前文件中, 且位于子类的前面
- 定义子类时, 必须在圆括号内指定父类的名称
super()
是一个特殊的函数, 可以让子类调用父类的方法- 父类又叫做超类(superclass)
重写父类的方法
- 只要在子类中定义一个与父类相同名字的方法即可覆盖父类的方法
4.导入类
- 使用
import
语句
在一个模块中导入多个类
from 文件名 import 类1, 类2, ...
导入整个模块
import 文件名
导入模块中的所有类(不推荐)
from 文件名 import *
- 推荐导入整个模块, 然后使用句号语法进行调用
使用别名
from 文件名 import 类名 as 别名
5. Python标准库
-
Python标准库是一组模块,我们安装的Python都包含它。你现在对函数和类的工作原理已有大致的了解,可以开始使用其他程序员编写好的模块了。可以使用标准库中的任何函数和类,只需在程序开头包含一条简单的import语句即可。
-
import random # 导入标准库里的ramdom模块 print(random.randint(1, 6)) # 使用标准库里的ramdom模块的randint函数
6. 类代码风格
- 类名使用驼峰命名法不适用下划线
- 实例名和模块使用小写字母外加下划线
- 每个类后边要有文档字符串
- 在模块中可以使用两行空行来分隔类
- 使用
import
导入类的时候每条语句隔一空行
7. 访问可见性问题
-
因为在很多面向对象编程语言中,我们通常会将对象的属性设置为私有的(private)或受保护的(protected),简单的说就是不允许外界访问,而对象的方法通常都是公开的(public),因为公开的方法就是对象能够接受的消息。在Python中,属性和方法的访问权限只有两种,也就是公开的和私有的,如果希望属性是私有的,在给属性命名时可以用两个下划线作为开头,下面的代码可以验证这一点。
class Test: def __init__(self, foo): self.__foo = foo def __bar(self): print(self.__foo) print('__bar') def main(): test = Test('hello') # AttributeError: 'Test' object has no attribute '__bar' test.__bar() # AttributeError: 'Test' object has no attribute '__foo' print(test.__foo) if __name__ == "__main__": main()
-
但是,Python并没有从语法上严格保证私有属性或方法的私密性,它只是给私有的属性和方法换了一个名字来妨碍对它们的访问,事实上如果你知道更换名字的规则仍然可以访问到它们,之所以这样设定,可以用这样一句名言加以解释,就是"We are all consenting adults here"。因为绝大多数程序员都认为开放比封闭要好,而且程序员要自己为自己的行为负责。
-
所以在Python中我们实在没有必要将类中的属性或方法用双下划线开头的命名处理成私有的成员,因为这并没有任何实际的意义。如果想对属性或方法进行保护,我们建议用单下划线开头的受保护成员,虽然它也不能真正保护这些属性或方法,但是它相当于给调用者一个暗示,让调用者知道这是不应该直接访问的属性或方法,而且这样做并不影响子类去继承这些东西。
-
"隐藏一切可以隐藏的实现细节,只向外界暴露(提供)简单的编程接口"。我们在类中定义的方法其实就是把数据和对数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以执行方法中的代码,也就是说我们只需要知道方法的名字和传入的参数(方法的外部视图),而不需要知道方法内部的实现细节(方法的内部视图)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~