Pyth 技术编程及基础 8_第1页
Pyth 技术编程及基础 8_第2页
Pyth 技术编程及基础 8_第3页
Pyth 技术编程及基础 8_第4页
Pyth 技术编程及基础 8_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Python编程基础项目七

面向对象程序设计7.1类和对象目录7.1.1类7.1.2对象Python编程基础7.1.1类Python编程基础面向对象编程:模拟现实世界的复杂性面向对象编程(OOP)是一种以对象为核心的编程范式。它更关注如何模拟现实世界的复杂性,通过定义对象及其交互方式,使我们能以直观且模块化的方式构建和维护复杂的软件系统。分类思想:从现实到代码的抽象将现实世界的“分类”概念引入编程类(Class)一个模板,定义了一类事物的共同属性和行为。例如,“动物”是一个抽象概念。→对象(Object)类的实例化结果。例如,“这只猫”或“那条狗”。通过类和对象,可以:1.抽象现实世界中的实体,将其转化为程序中的数据和逻辑。2.组织代码结构,提升代码的复用性、可维护性和可读性。3.简化复杂问题的解决方案,通过模块化设计降低复杂度。为什么需要类和对象?类与对象在实际开发中的应用模拟现实实体如“学生”、“书籍”、“汽车”,将现实世界概念直接映射为代码中的类,使程序设计更直观。封装数据与逻辑将数据(属性)和操作数据的方法捆绑在一起,隐藏内部实现细节,使代码更清晰、安全。建模复杂系统如电商平台中的“用户系统”、“订单系统”,通过对象间的交互来模拟复杂的业务流程。类类的主要作用是抽象一类事物的共同特点,并为其行为提供一个统一的定义:属性(Attributes)描述事物的特性,如姓名、年龄。方法(Methods)描述事物的行为,如人可以走路、说话。classClassName:#类的属性和方法def__init__(self):#初始化方法(构造函数)pass

defmethod_name(self):#定义一个普通方法pass定义类的语法如下:1.class关键字使用class定义一个类,后面紧跟类的名称,类名一般使用大驼峰命名法(如MyClass)。类2.类体类的定义包含在缩进的类体中。类体中可以包含:(1)类属性:类属性是直接在类体中定义的变量,它们被类的所有实例共享。(2)实例属性:实例属性属于类的各个实例对象,通过类的构造方法__init__来初始化。上面的radius是实例属性,在创建Circle实例时必须传入对应的参数,如c=Circle(20),就为c实例初始化了radius为20。(3)方法:定义类的行为。类的方法与普通函数类似,但第一个参数必须是self,表示方法属于当前对象。通过方法,类可以实现具体的行为。例如:01 classCircle:02 pi=3.1403 04 def__init__(self,radius):05 self.radius=radius06 07 defcalculate_area(self):08 returnself.pi*(self.radius**2)09 10 defcalculate_circumference(self):11 return2*self.pi*self.radius在这个Circle类中,pi就是类属性,任何Circle类的实例都可以访问它,无需额外定义。类7.1.2对象Python编程基础对象的创建:实例化通过调用类名来创建对象,这个过程叫做“实例化”。person1=Person()#创建一个Person类的对象person1是Person类的一个对象,表示一个具体的“人”。我们可以通过这个对象来访问类中定义的属性和方法。对象允许我们对类的属性和方法进行操作。我们可以根据一个类创建多个对象,每个对象都有独立的属性和行为。对象例如:classPerson:

#初始化方法:创建对象时初始化姓名、年龄属性

def__init__(self,name,age):=name#实例属性:姓名

self.age=age#实例属性:年龄

#实例方法:自我介绍

defintroduce(self):print(f"Mynameis{},andIam{self.age} yearsold.")person1=Person("Alice",25)person2=Person("Bob",30)#访问实例方法roduce()#输出:MynameisAlice,andIam25yearsold.roduce()#输出:MynameisBob,andIam30yearsold.

对象的特点:独立性:每个对象都是独立存在的个体,彼此之间的属性值可以不同。灵活性:通过对象,我们可以方便地调用类的方法或修改属性的值。具体性:类是抽象的,而对象是具体的。Python编程基础Python编程基础项目七

面向对象的程序设计7.2类的属性和方法目录7.2.1类的属性7.2.2类的方法Python编程基础7.2.1类的属性Python编程基础属性:对象的“数据”或“特征”可视化理解:汽车实体与它的特征参数核心定义本质是与类/对象绑定的变量,用于存储数据,描述对象的状态或特征。通俗类比•设计图上的参数(类属性)•实车的具体配置(实例属性)类属性ClassAttribute实例属性InstanceAttribute类属性:所有对象共享的“公共特征”类(顶层)包含属性,所有实例(底层)共享该属性核心定义直接定义在类内部、但在任何方法之外的变量。关键特性•属于类本身,而非特定对象•所有实例共享同一个值形象类比:房子与屋顶“有屋顶”是所有房子的共性,无论盖多少栋房子,都继承这一特征。💡

类属性是类的“全局变量”,由所有对象共享Python类属性:定义与访问万物皆对象

属性共分享类属性定义在类内部、方法外部,属于类本身。它被该类的所有实例对象共享,是所有对象共有的特征描述。classPerson:species="Homosapiens"#定义类属性#访问方式:类名直接访问或实例访问print(Person.species)#输出:Homosapiensprint(Person().species)#输出:Homosapiens💡修改类属性会影响所有实例,修改实例属性则只影响自身修改类属性代码演示classPerson:species="Homosapiens"#实例化两个对象p1=Person()p2=Person()#关键点:通过类名修改属性Person.species="Human"#结果:p1和p2的species都变成了Human核心原理:共享蓝图类属性存储在类对象本身中,就像是工厂的“蓝图”。所有实例化的对象(产品)都共享这份蓝图。当你修改蓝图(类属性),所有已生产和未生产的产品(实例)都会同步更新规格。结论:修改类属性→所有实例同步改变记忆口诀:类属性一变,所有实例跟着变实例属性:每个对象独有的“个性特征”核心定义定义在类的构造方法(通常是__init__)内部,以self.属性名

形式赋值的变量。关键特点属于具体的实例而非类实例间数据独立互不干扰存储对象独有的状态数据生动比喻以“房子”类为例:每一栋房子都有独有的属性,如“红色外墙”、“120平米”、“市中心”等,这些都是每栋房子的个性特征。Python面向对象:定义与访问实例属性Python代码示例classPerson:def__init__(self,name,age):=name#实例属性self.age=agep1=Person("Alice",25)#创建实例p2=Person("Bob",30)print()#输出:Alice构造方法__init__创建实例时自动调用,用于初始化对象状态,接收self及自定义参数。绑定实例属性通过self.属性名=值定义,每个对象拥有独立的数据副本,互不干扰。访问属性使用对象名.属性名的方式获取或修改数据,如获取名字。💡self代表实例本身,每个实例的属性都是独立的。修改实例属性对象的“私有领地”每个实例都拥有独立的属性副本,修改自己的属性,与他人无关。classPerson:...#定义类p1=Person("Alice",25)#创建实例1p2=Person("Bob",30)#创建实例2#修改p1的年龄属性p1.age=26#结果:p1.age=26,p2.age依然是30结论:修改一个实例的属性,只会影响该实例本身,其他实例完全不受影响。类属性vs.实例属性类属性(ClassAttribute)📌定义:类内部,所有方法之外🏷️归属:属于类本身,而非单个对象🤝共享性:所有实例共享同一个值🔧修改影响:修改后所有实例都会受影响🎯用途:存储通用特征、常量、配置项实例属性(InstanceAttribute)📌定义:类的方法内部(通常是__init__)🏷️归属:属于具体的实例(对象)🔒共享性:每个实例拥有独立的副本🔧修改影响:修改后仅该实例受影响🎯用途:存储每个对象的独特状态/数据💡区别:类属性是“共享”的公共资源,实例属性是“独享”的个体资产注意:修改类属性classPerson:species="Homosapiens"p1=Person()p1.species="Human"#陷阱:创建了实例属性#结果:Person.species

依然是"Homosapiens"原理揭秘:Python会在实例上创建同名实例属性,它会“遮蔽”对类属性的访问,导致类属性未被修改。💡不要通过实例去修改类属性!请直接通过类名操作。核心定义:属性是类和对象的“数据”或“特征”,是描述事物状态的关键信息。类属性(Class)属于类,被所有实例共享定义在类内部,方法外部修改它会影响所有实例实例属性(Instance)属于具体实例,每个实例独有定义在方法内部(通常是__init__)修改它只影响自身小结7.2.2类的方法Python编程基础类中的方法030201

实例方法

静态方法

类方法方法是定义在类内部的函数,用于描述类和对象的行为。1、实例方法实例方法作用于具体的对象实例。它的第一个参数必须是self,其代表了调用该方法的具体对象本身。class

BankAccount:

#类属性:所有账户共享

bank_name

=

"PythonBank"

def

__init__(self,owner,balance):

#实例属性:每个账户独有

self.owner

=

owner

self.balance

=

balance

#实例方法:存款

def

deposit(self,amount):

self.balance

+=

amount

print(f"{amount}deposited.Newbalance:{self.balance}")

#使用示例account

=

BankAccount("Alice",1000)

#调用实例方法account.deposit(500)#输出:500deposited.Newbalance:1500示例1:2、类方法类方法作用于整个类,而不是某个实例。它通过@classmethod装饰,并接收cls参数来表示类本身。class

BankAccount:

bank_name

=

"PythonBank"

#类属性

@classmethod

def

change_bank_name(cls,new_name):

cls.bank_name

=

new_name

#调用方式:类名.方法名BankAccount.change_bank_name("GlobalPythonBank")

print(BankAccount.bank_name)

#输出:GlobalPythonBank示例2:3、静态方法静态方法是独立于实例和类的,使用@staticmethod装饰,不需要接收self或cls参数,通常用于封装一些与类相关但不依赖于实例或类的逻辑。class

BankAccount:

bank_name

=

"PythonBank"

#类属性

@staticmethod

def

bank_policy():

print("Ourpolicy:Nohiddenfees!")

#调用静态方法BankAccount.bank_policy()#输出:Ourpolicy:Nohiddenfees!

示例3:类中的方法第一个参数是self,操作对象数据,通过对象.方法()调用。实例方法第一个参数是cls,操作类数据,通过类名.方法()调用。类方法无特殊参数,封装工具逻辑,通过类名.方法()调用。静态方法class

BankAccount:

bank_name

=

"PythonBank"

def

__init__(self,owner,balance):

self.owner

=

owner

self.balance

=

balance

def

deposit(self,amount):

self.balance

+=

amount

print(f"{amount}deposited.Newbalance:{self.balance}")

@classmethod

def

change_bank_name(cls,new_name):

cls.bank_name

=

new_name

@staticmethod

def

bank_policy():

print("Ourpolicy:Nohiddenfees!")

account

=

BankAccount("Alice",1000)

#调用实例方法account.deposit(500)#输出:500deposited.Newbalance:1500

#调用类方法BankAccount.change_bank_name("GlobalPythonBank")print(BankAccount.bank_name)#输出:GlobalPythonBank

#调用静态方法BankAccount.bank_policy()#输出:Ourpolicy:Nohiddenfees!类中的方法实例方法类方法静态方法总结Python编程基础Python编程基础项目七面向对象的编程7.3继承与多态目录7.3.1继承7.3.2多态Python编程基础7.3.1继承Python编程基础继承Python编程基础一个问题父类子类defskill(self):print(“我会做馒头”)defskill(self):print(“我会做蛋糕”)继承Python编程基础又一个问题重写又叫覆盖,老手艺已经不在了继承Python编程基础重写后访问父类方法可以通过“父类名.父类方法”调用调用前,使用父类__init__()初始化继承Python编程基础继承中的selfself总是指向发起方法调用的那个实例Father.skill(self)selfskill(self)继承与派生Python编程基础继承的概念减少重复代码代码逻辑清晰继承与派生PersonnamegenderagenamegenderagemajordeptStudentPython编程基础父类与子类继承与派生Python编程基础派生-定义父类classPerson:def__init__(self,name,gender,age):=nameself.gender=genderself.age=agedefintroduce(self):returnf’Iam{},mygenderis{self.gender}andIam{self.age}.’形参,属性名都要做到“望文知义”继承与派生Python编程基础派生-派生子类classStudent(Person):def__init__(self,name,gender,age,major,detp):Person.__init__(self,name,gender,age)self.major=majorself.dept=deptdefintroduce(self):returnf’Iam{},mygenderis{self.gender}andIam{self.age},mymajor is{self.major,andIamin{self.dept}.’继承与派生Python编程基础验证p1=Person(“James”,”male”,50)s1=Student(“Jack”,”male”,22,”IoT”,”NC”)print(roduce())print(roduce())IamJames,mygenderismale,andIam50IamJack,mygenderismale,andIam22,mymajorisIoT,IamNC多继承Python编程基础多继承的概念python允许一个类同时从多个父类继承属性和方法,这就是多继承子类父类做馒头做包子做蛋糕多继承Python编程基础继承谁?多继承Python编程基础方法继承两个父类中都有skill()函数那该如何继承呢?MRO(MethodResolutionOrder)7.3.2多态Python编程基础多态Python编程基础多态的概念多种形态,同一事物在不同场景下有不同形态一个函数,输入参数不同实现不同的效果printf(f’Helloworld!’);printf(f’val={val}’);Helloworld!val=10多态Python编程基础实现多态的条件1)继承2)函数重写3)父类引用指向子类对象子类重写父类函数子类对象传递给父类对象调用者定义父类、子类多态Python编程基础多态-类的继承AnimalDogCatclassAnimal:defsound(self):print(“helloanimals”)classDog(Animal):passclassCat(Animal):pass多态Python编程基础多态-函数重写AnimalDogCatclassAnimal:defsound(self):print(“helloanimals”)classDog(Animal):defsound(self):print(“汪汪汪”)classCat(Animal):defsound(self):print(“喵喵喵”)多态Python编程基础多态-父类引用指向子类对象AnimalDogCatd=Dog()c=Cat()dcdefmakeSound(an:Animal):an.sound()makeSound(d)makeSound(c)汪汪汪喵喵喵多态Python编程基础优势1.模块之间解耦,方便拓展2.对外提供统一接口Python编程基础Python编程基础项目七面向对象的编程7.4封装与私有化目录7.4.1访问权限7.4.2属性的访问器与修改器Python编程基础7.4.1访问权限Python编程基础权限Python编程基础现实问题父类子类父类如果想保留一部分私有财产该如何处理呢?权限Python编程基础私有属性/方法私有属性以“双下划线__”开头私有属性仅在类的内部可以调用私有方法同样仅在类的内部调用可行吗?权限Python编程基础子类访问父类属性/方法私有属性子类不可继承权限Python编程基础保护属性保护属性以”单下划线_“开头类的对象和子类对象都能访问子类直接访问父类保护属性是可以的,但破坏了数据封装原则,所以不推荐7.4.2属性的访问器与修改器Python编程基础Pythonic编程Python编程基础属性的受控访问在python中访问器(getter)和修改器(setter)是封装属性的两种方法,核心目的是实现对属性的受控访问,而非直接暴露类内部的实例变量。访问器:用于获取属性值,还可以在返回数据前添加权限校验、格式化等逻辑。修改器:用于设置属性值,还可以在赋值时添加类型检查、范围检查等逻辑。Pythonic编程Python编程基础非pythonic方法写法繁琐逻辑清晰Pythonic编程Python编程基础pythonic方法将方法伪装成属性方法中增加逻辑判断将方法伪装成属性Pythonic编程Python编程基础逻辑校验语法更加简洁,符合优雅编程哲学不破坏接口兼容性,且带验证功能对数据有校验、限制等时推荐使用Python编程基础Python编程基础项目七面向对象的编程7.5类的特殊方法与运算符重载目录7.5.1特殊方法7.5.2运算符重载Python编程基础7.5.1特殊方法Python编程基础特殊方法Python编程基础概念命名规则Python特殊方法以双下划线开头和结尾,如__init__、__str__,用于定义类的内置行为,例如初始化对象或字符串表示。

触发机制特殊方法通常由Python解释器自动调用,如执行print(obj)时

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论