Python面向对象:class定义类与创建实例对象
Python面向对象class定义类与创建实例对象一、开篇class——创建自定义类型的蓝图在Python中一切皆对象——整数是int类的实例字符串是str类的实例列表是list类的实例。class关键字让你创建自己的类型。这就像从使用内置工具进化到自己制造工具。⌨️ 最基本的class# 定义一个类classPerson:人类——最简单的类定义pass# 空类什么都没有# 创建实例对象p1Person()p2Person()print(type(p1))# class __main__.Personprint(isinstance(p1,Person))# Trueprint(p1isp2)# False —— 两个不同的实例二、class的基本语法2.1 类定义和命名规范# 类名使用PascalCase大驼峰——PEP 8规范# ✅ 好的命名classStudent:passclassBankAccount:passclassHttpRequestHandler:pass# ❌ 不好的命名# class student: # 应该大写开头# class bank_account: # 应该用驼峰# class HTTP_Request: # 缩写保持大写但下划线不必要# 类的文档字符串classPoint:二维空间中的一个点。 表示平面直角坐标系中的一个位置。 Attributes: x: 横坐标 y: 纵坐标 pass# 类的文档字符串可以通过__doc__访问print(Point.__doc__)2.2 添加属性和方法# 最简单的带属性和方法的类classDog:狗——带属性和方法# 类属性——所有实例共享species犬科动物# 初始化方法——创建实例时自动调用def__init__(self,name,age):self.namename# 实例属性self.ageage# 实例属性# 实例方法——操作实例数据defbark(self):returnf{self.name}说: 汪汪defcelebrate_birthday(self):过生日——年龄1self.age1returnf{self.name}现在{self.age}岁了# 创建实例dog1Dog(旺财,3)dog2Dog(小黑,1)# 访问属性和方法print(dog1.name)# 旺财print(dog1.bark())# 旺财说: 汪汪print(dog1.species)# 犬科动物 —— 类属性所有实例共享print(dog2.species)# 犬科动物 —— 同样的值# 各自独立的状态print(dog1.celebrate_birthday())# 旺财现在4岁了print(dog2.age)# 1 ——不变的2.3 类也是对象# Python中一切皆对象——类本身也是对象type的实例classMyClass:一个简单的类pass# 类是一个type对象print(type(MyClass))# class typeprint(type(MyClass()))# class __main__.MyClass# 类可以被赋值给变量AliasMyClass objAlias()# 等价于 MyClass()print(type(obj))# class __main__.MyClass# 类可以作为参数传递defdescribe_class(cls):returnf类名:{cls.__name__}, 文档:{cls.__doc__}print(describe_class(MyClass))# 类可以动态创建元编程# type(name, bases, dict) —— 动态创建类DynamicClasstype(DynamicClass,(),{x:10,hello:lambdaself:Hello!})objDynamicClass()print(obj.x)# 10print(obj.hello())# Hello!三、实例的创建过程3.1init__和__new# Python创建实例分两步# 1. __new__() —— 创建对象分配内存——很少需要重写# 2. __init__() —— 初始化对象设置属性——最常用classDemo:演示实例创建过程def__new__(cls,*args,**kwargs):创建实例——在__init__之前调用print(f1. __new__ 被调用, cls{cls.__name__})instancesuper().__new__(cls)# 调用object的__new__print(f 创建了实例:{instance})returninstancedef__init__(self,name):初始化实例——在__new__之后调用print(f2. __init__ 被调用, self{self})self.namenameprint(f 设置了 name{self.name})# 创建实例demoDemo(测试)# 输出# 1. __new__ 被调用, clsDemo# 创建了实例: __main__.Demo object at ...# 2. __init__ 被调用, self__main__.Demo object at ...# 设置了 name测试# 99%的情况下你只需要__init__# __new__主要用于不可变类型的子类str, int, tuple和单例模式3.2 动态属性# Python允许在运行时给实例添加属性# 但这不推荐——破坏了一致性classStudent:def__init__(self,name):self.namename sStudent(张三)s.age20# 动态添加属性——可以但不推荐s.emailzstest.com# __dict__属性——查看实例的所有自定义属性print(s.__dict__)# {name: 张三, age: 20, email: zstest.com}# __slots__可以限制实例的属性后面文章会讲四、实战案例4.1 学生管理系统classStudent:学生类school第一中学# 类属性——所有学生共享def__init__(self,student_id,name,grade):self.student_idstudent_id self.namename self.gradegrade self.scores{}# 科目→分数defadd_score(self,subject,score):添加或更新成绩ifnot0score100:raiseValueError(分数必须在0-100之间)self.scores[subject]scorereturnf{self.name}的{subject}成绩已更新为{score}分defget_average(self):计算平均分ifnotself.scores:return0returnsum(self.scores.values())/len(self.scores)defget_report(self):生成成绩报告lines[f学生:{self.name}(学号:{self.student_id})]lines.append(f学校:{self.school})lines.append(f年级:{self.grade})lines.append(-*30)forsubject,scoreinself.scores.items():grade优秀ifscore90else良好ifscore80else\中等ifscore70else及格ifscore60else不及格lines.append(f{subject}:{score}分 ({grade}))lines.append(f 平均分:{self.get_average():.1f})return\n.join(lines)# 使用s1Student(S001,张三,九年级)s1.add_score(语文,88)s1.add_score(数学,92)s1.add_score(英语,85)print(s1.get_report())五、总结class是创建自定义类型的蓝图。理解类和实例的关系——类是模板实例是具体的产品——是OOP的起点。核心要点类名用PascalCase命名**__init__**初始化实例属性实例属性各自独立类属性所有实例共享类本身也是对象——type的实例✅ 一个.py文件通常包含一个主要的类和几个辅助类。类是组织代码的容器。

相关新闻

最新新闻

日新闻

周新闻

月新闻