一、类的定义
Python是一种动态类型语言,可以在运行过程中添加、修改对象的类属性。这点和JAVA不同。
# 类
# 类是对象的抽象
# 类里面的函数称为方法
# 类的命名通常遵循用首字母大写的驼峰式命名法(CapWords,也称为骆驼式命名法)。
# 私有类的命名遵循用下划线开头的驼峰式命名法(_CapWords)。
# 类中使用__开头且以__结尾的方法称为魔术方法,也叫魔法方法
# __init__ ----> 初始化方法,在调用构造器语法创建对象时会自动被调用
# __str__ ----> toString方法,在使用print函数打印对象时被调用,可以输出对象的属性,而不是地址
# __repr__ ----> representation,容器内对象的toString方法,将对象放入容器里,输出容器对象时,可以输出对象的属性,而不是地址
# repr的作用包含了str。
# __lt__ ----> 比较大小,可以定义两个对象进行比较,返回布尔值。
## __slots__ ----> 限制类属性,只能有这些属性
from abc import abstractmethod
class Student:
""""
学生
"""
# 表示这个类只能有一下属性,不能在调用的过程中去动态的添加其他属性
__slots__ = ('__name', 'age')
# 构造函数,创建对象时调用
# self表示当前对象
# __init__表示构造函数
# python的方法第一个参数代表当前对象,命名为self或者_self都可以
# self.name表示当前对象的name属性
# self.age表示当前对象的age属性
def __init__(self, name, age):
self.__name = name
self.age = age
# toString方法
def __str__(self):
return f"{self.__name}的年龄是{self.age}"
# toString方法
def __repr__(self):
return f"{self.__name}的年龄是{self.age}"
# 定义一个自我介绍方法
def introduce(self,sameone: str = '张三'):
""""
自我介绍
"""
print(f"你好,{sameone},我的名字是{self.__name}, 我今年{self.age}岁了")
# 静态方法
# 精通方法创建有两种方式,两种方式是等价的
# 方式一:.使用@staticmethod装饰器
@staticmethod
def static_method():
print("静态方法")
# 方式二:.使用@classmethod装饰器
# cls表示当前类
@classmethod
def class_method(cls):
print("类方法")
# 抽象方法添加 @abstractmethod 注解,不加也不影响程序运行
@abstractmethod
def abstract_method(self):
pass
二、类的引用
# 从当前类中引用另外一个类
# 方式一: 直接引用一个类,则里面的方法都可以直接调用
import example01
# 方式二: 引用一个类的某一个方法,并指定别名,然后通过类名.方法名()的方式调用
from example06 import add as add_func
print(add_func(1,2))
# 引用其他包的类, 如: demo.strUtil
import demo.strUtil
print(demo.strUtil.add(1,2))
# 注意: 引用一个类时,会将这个类里面的方法外部代码都执行一遍
# 匿名函数 __name__ 读“当得”
print(__name__) # 在当前类中调用这个函数,会返回 __main__,而在引用这个函数时,会返回这个类的实际名称,如 example06
# 如果从两个类中引用了两个同名方法,则先引用的会被后引用的覆盖掉
from example06 import add as add_func
from demo.strUtil import add as add_func # 最终引用的是这个
# 有两种解决方法:
# 方法一:使用不同的别名
from example06 import add as add_func
from demo.strUtil import add as add_func_2
# 方法二:使用完全限定名
import example06
import demo.strUtil
print(example06.add(1,2))
print(demo.strUtil.add(1,2))
# 关键字参数
def foo(a, b, c):
print(a, b, c)
# 正常传参对号入座,这种参数称为位置参数
foo(1, 2, 3)
# 关键字参数,可以不用对号入座
foo(b=1, a=2, c=3)
# 命名关键字参数
# 写在 * 后面的参数,称为命名关键字参数, 这些参数在传参时必须指定参数名
# 关键字参数只能出现在位置参数的后面
def foo(a, b, *, c):
print(a, b, c)
print(foo(1, 2, c=3)) # * 后面的参数必须指定参数名
# 可变参数
# 可变参数前面用 * 号修饰,函数调用时,可变参数会以元组方式传入,可接收0个或多个参数
def foo(*args):
print(args, type(args)) # (1, 2, 3) <class 'tuple'>
foo(1, 2, 3)
备注:如果新建一个package,里面会自动生成一个__init__文件,在这个文件中定义的方法函数只属于这个包,而不属于任何一个类,这个类的代码会在文件被加载时执行 。调用这个文件里面的函数时,只需引用这个包即可,而不用引用这个类。
三、创建对象
# 对象的创建
from example09 import Student
# main 函数
# main 函数 一般作为程序的入口函数
def main():
student1 = Student('张三', 18)
student1.introduce('李四')
student1.__name = '李四'
print(student1)
# 程序入口,只在当前类中执行则触发下面代码
if __name__ == '__main__':
main()
四、异常处理
# 异常处理
# python的异常处理 是使用try...except...finally...else...来处理的
i = 1
try:
print(1 / i)
print('执行完毕')
except ZeroDivisionError as error: # 不写异常类型代码任意异常都捕获
print(error)
else:
print('没有报错')
finally:
print('报错必须执行')
五、继承
# 继承
# Python中往类中传入一个类,代表两个类有了继承关系
# Python的继承是多继承的,一个类可以继承多个类,这跟JAVA不同,但尽量不要使用多继承,否则会给代码带来不必要的麻烦
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# 吃饭
def eat(self):
print('吃饭')
# 学生继承人类
class Student(Person):
def __init__(self, name, age, score):
# 子类调用父类的方法使用 super()
super().__init__(name, age)
self.score = score
def eat(self):
print('学生吃饭')
def study(self):
print('学生学习')