04-python基础

发布时间 2023-12-15 11:51:14作者: zxinlog

类与对象

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__ 属性,可以查看模块的完整路径。