04-python基础
类与对象
python 中同样存在类和对象的概念,在python的类中,通过class 创建声明类,类中存在构造函数和析构函数,而且存在一个类似于Java中的toString。
def __init__(self)
def __del__(self)
def __str__(self)
self 是python中类似于其他语言中 this 的功能。类成员变量就通过这个self进行定义
def __init__(self, name, age):
self.name = name
self.age = age
封装
python 是一个面向对象的编程语言,面向对象就会存在封装继承多态的特性,对于封装而言,python 主要是通过约定俗成对变量或函数进行封装。比如一个类中存在的成员变量,如果以两个下划线进行声明,就会成为封装后的数据,封装后的数据或函数在外部就不可以直接使用对象进行访问。
class A:
def __init__(self, name):
self.__name = name
此时的 __name 不能通过对象直接访问。相较于函数而言也是一样的,需要使用前置两个下划线进行声明。
子类不能调用父类的私有方法,但子类可以通过调用父类的公有方法(父类的公有方法中调用父类的私有方法)这种方式进行调用。
继承
继承可以实现代码的复用性,子类通过继承父类,可以继承父类的公有方法、成员变量。
如果父类中的方法需要改动,也可以在子类中的同名方法中,进行函数重写或扩展。
扩展就是在子类的方法中调用父类的方法,使用 super()
表示父类。
super 还可以通过以指定父类的方式进行调用。super(父类, self)
以这种方式进行调用。
python中存在单继承和多继承,多继承中使用了一种 mro 的属性进行筛选。用于在多继承、菱形继承中判断方法、属性的调用路径。
多态
python 中的多态相比而言没有更多的限制,只要传入的对象具备响应的方法就可以执行。
类属性和类方法
在程序运行时,类也会被加载到内存,类也是一种对象,类对象。
在其他语言中,静态方法通过类名的方式来调用。在python 中,存在一种类变量和类方法。
class A:
count = 0
@classmethod
def func(cls):
...
其中的count,通过 A.count 进行调用, func 中的cls 就是类A自身。func中可以通过 cls.count 访问到类变量。也可以通过A.count 进行访问。类方法需要使用 @classmethod 进行前置声明。
而self. xxx 中的xxx属于实例属性,是实例对象具备的属性。
静态方法
如果需要一个方法,既不用访问实例变量,也不用访问类变量或类方法。就可以声明为静态方法。
class A:
@staticmethod
def func():
...
现在就很清楚了,
如果想要访问实例属性,则创建实例方法。
如果只想要访问类属性,则创建类方法。
如果既不访问实例属性,又不访问类属性,则创建静态方法。
实例方法中也可以访问类属性,只需要类名.
的形式即可。
静态方法中存在 cls
单例
python 通过类名() 创建新对象的时候,python 的解释器会调用两个方法,__new__
分配内存空间,__init__
对象初始化。
此时就可以考虑使用单例模式,在new中进行判断,cls.instance 是否为空,如果为空,则分配新内存空间,如果不为空,则直接返回 cls.instance, 可以通过 id 查看内存空间是否保持一致。
class Object:
instance = None
def __new__(cls):
if cls.instance is None:
cls.instance = super().__new__(cls)
return cls.instance
通过以上这种形式,就能够保证 Object() 返回的是一个单例。
class A:
def __new__(cls, *args, **kwargs):
return super().__new__(cls)
def __init__(self, name):
self.name = name
def __str__(self):
return self.name
当类中存在 __new__
时,创建对象就会先调用 __new__
, 因此,new的参数就需要有除了cls之外的东西。
且new一定要return super的new方法,传入一个cls,用于创建内存空间。如果没有这一句,则没有申请内存空间,也就不存在创建对象了。
异常
Java中使用try catch 捕获异常,Python中使用try except 捕获异常,使用raise抛出异常。
示例:
def input_passwd():
pwd = input("请输入密码")
if len(pwd) > 8:
return pwd
else:
ex = Exception("密码长度不足八位")
raise ex
try:
print(input_passwd())
except Exception as ex:
print(ex)
python 中的异常可通过Exception自己创造。通过raise 进行抛出。
try...except 类似于其他语言的try...catch ,试图执行程序。
模块
模块就是 python 源文件,每一个 py 文件都是一个模块。只有导入模块才能使用这个模块中的工具。
通过 import
导入模块,导入之后,可使用模块的全局变量、函数、类。如果需要导入的模块名字太长,也可以通过 import xxx as xx
通过使用 as 自定义模块的名字。在使用其中定义的函数时,可直接通过xx.进行调用。模块别名应符合 大驼峰原则。
可以使用 from xxx import xx
从一个模块中导入部分工具进行使用。
如果两个模块中包含同名的函数,后导入模块的函数会覆盖掉先导入的模块中的函数。这种情况下,就应该使用as对模块进行别名处理。from xx import *
从一个模块中引入全部内容。效果类似 import xx
python 解释器倒入模块时,会先从当前目录中搜索,有就直接导入,如果当前目录不存在,再从系统目录搜索。自行编写的模块尽量不要和系统的模块重名。
每个模块具备一个 __file__
属性,可以查看模块的完整路径。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!