手机分销网站公司行业资讯网
2026/1/22 9:46:34 网站建设 项目流程
手机分销网站公司,行业资讯网,佛山网站快照优化公司,网络营销和推广的方法Python 面向对象核心概念梳理 Python从设计之初就已经是一门面向对象的语言#xff0c;正因为如此#xff0c;在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。 如果你以前没有接触过面向对象的编程语言#xff0c;那你可能需要先了解一…Python 面向对象核心概念梳理Python从设计之初就已经是一门面向对象的语言正因为如此在Python中创建一个类和对象是很容易的。本章节我们将详细介绍Python的面向对象编程。如果你以前没有接触过面向对象的编程语言那你可能需要先了解一些面向对象语言的一些基本特征在头脑里头形成一个基本的面向对象的概念这样有助于你更容易的学习Python的面向对象编程。接下来我们先来简单的了解下面向对象的一些基本特征。一、面向对象技术简介类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。类变量: 类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。数据成员: 类变量或者实例变量, 用于处理类及其实例对象的相关的数据。方法重写: 如果从父类继承的方法不能满足子类的需求可以对其进行改写这个过程叫方法的覆盖(override),也称为方法的重写。局部变量: 定义在方法中的变量只作用于当前实例的类。实例变量: 在类的声明中属性是用变量来表示的。这种变量就称为实例变量是在类声明的内部但是在类的其他成员方法之外声明的。继承: 即一个派生类derived class继承基类base class的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如有这样一个设计一个Dog类型的对象派生自Animal类这是模拟是一个is-a关系例图Dog是一个Animal。实例化: 创建一个类的实例类的具体对象。方法: 类中定义的函数。对象: 通过类定义的数据结构实例。对象包括两个数据成员类变量和实例变量和方法。二、创建类与对象类是面向对象程序设计的基础可以定义指定类的对象。类中可以定义属性特性和方法行为。1、定义类在 Python 中通过 class 关键字来定义类。定义类的语法格式如下calss 类名:成员变量 成员函数例如定义了一个 Person 类# 定义 Person 类classPerson:namebrenden# 定义了一个属性defprintName(self):# 定义了一个方法print(self.name)2、对象的创建和使用在 Python 中用赋值的方式创建类的实例一般格式为对象名 类名参数列表创建对象后可以使用 “.” 运算符通过实例对象来访问这个类的属性和方法函数一般格式为对象名.属性名 对象名.函数名()例如语句 “p Person()” 产生了一个 Person 的实例对象此时可以用 p.name 来调用类的 name 属性。# 类和对象应用示例classCC:x20# 定义属性y20# 定义属性z30# 定义属性defshow(self):# 定义方法print((self.xself.yself.z)/3)bCC()# 创建实例对象 bb.x30# 调用属性b.show()# 调用方法 show# 输出# 26.6666666666666683、类属性和实例属性- 类属性类属性为所有类对象的实例对象所共有。类属性通常在类体中初始化。对于公有的类属性在类外可以通过类对象和实例对象访问。定义 Person 类定义类属性和方法# 定义 Person 类定义类属性和方法classPerson:namebrenden# 公有的类属性__age18# 私有的类属性pPerson()print(p.name)# 正确但不提倡print(Person.name)# 正确print(p.__age)# 错误不能在类外通过实例对象访问私有的类属性print(Person.__age)# 错误不能在类外通过类对象访问私有的类属性# 输出# p.name# brenden# Traceback (most recent call last):# File c:\Gitee\python\04_Day\03_oop.py, line 9, in module# print(p.__age) # 错误不能在类外通过实例对象访问私有的类属性# AttributeError: Person object has no attribute __age- 实例属性实例属性不需要在类中显式定义而应在 _ _init _ _ 构造函数中定义定义时以 self. 作为前缀实例属性属于特定的实例。在其他方法中也可以随意添加新的实例属性但并不提倡这么做所有的实例属性最好在 _ _ init _ _ 中给出。实例属性在内部通过 “ self. ” 访问在外部通过对象实例访问。定义 Student 类定义实例属性和方法# 定义 Student 类定义实例属性和方法classStuden:def__init__(self,name,age,grade):self.namename self.ageage self.gradegradedefsay_hi(self):print(I am a student,my name is,self.name)s1Studen(二二,21,3)s1.say_hi()print(s1.grade)s2Studen(三三,19,1)s2.say_hi()print(s2.grade)# 输出# I am a student,my name is 二二# 3# I am a student,my name is 三三# 1上述例子中Student 类中定义了实例属性 name、age 和 grade。s1、s2 是 Student 的两个实例这两个实例分别拥有自己的属性值有别于其他对象。实例的属性可以像普通变量一样进行操作例如s1.grades1.grade14、类的方法方法是与类相关的函数。方法和函数不同函数是封装操作的小程序。方法是定义在类内部的函数并且定义方法与普通函数有所不同。类的方法主要三种类型实例方法、类方法和静态方法不同的方法有不同的使用场景和声明调用形式不同的方法也具有不同的访问限制。- 方法的声明和调用在类的内部使用 def 关键字可以为类定义一个方法。与一般函数定义不同类方法必须包含对象本身的参数通常为 self 且为第一个参数。声明方法的语法格式如下def方法名(self,[形参列表]):函数体方法调用的语法格式如下对象.方法名([参数列表])在调用方法时第一个参数 self 不需要用户为其赋值Python 自动把对象实例传递给参数 self。- 实例方法实例方法是在类中经常定义的成员方法它至少有一个参数并且必须以实例对象作为其第一个参数一般以 “self” 作为这第一个参数。在类外实例方法只能通过实例对象去调用。实例方法的声明格式如下def方法名(self,[形参列表]):函数体实例方法通过实例对象调用:对象.方法名([参数列表])定义 Person 类通过实例调用实例方法# 但行好事莫问前程classPerson:placeChangshadefgetPlace(self):# 实例方法至少有个 self 参数returnself.place pPerson()# 创建实例对象 pprint(p.getPlace())# 正确可以通过实例对象引用print(p.place)# 通过实例对象 p 调用对象属性# 输出# Changsha# Changsha- 类方法类方法不对特定实例进行操作在类方法中访问实例属性会导致错误。类方法需要用修饰器 “ classmethod” 来标识其为类方法。对于类方法第一个参数必须是类对象一般以 “cls” 作为这第一个参数类方法可通过实例对象和类对象去访问。类方法的声明格式如下classmethoddef类方法名(cls,[形参列表]):函数体类方法调用格式如下类名.类方法([实参列表])通过实例对象和类对象去访问类方法。创建 Person 类定义并调用类方法# 创建 Person 类定义并调用类方法classPerson:placeChangshaclassmethod# 类方法以 classmethod 来进行修饰defgetPlace(cls):returncls.place pPerson()print(p.getPlace())# 可以用过实例对象引用print(Person.getPlace())# 可以通过类对象引用# 输出# Changsha# Changsha类方法还有一个用处就是可以对类属性进行修改。# 创建 Person 类定义并修改类属性classPerson:placeChangshaclassmethod# 标识其为类方法defgetPlace(cls):returncls.place classmethoddefsetPlace(cls,place1):cls.placeplace1 pPerson()p.setPlace(Shanghai)# 修改类属性print(p.getPlace())print(Person.getPlace())# 输出# Shanghai# Shanghai- 静态方法静态方法需要通过修饰器 “ staticmethod” 来进行修饰静态方法不需要多定义参数。创建 Person 类定义并调用静态方法# 创建 Person 类定义并调用静态方法classPerson:placeChangshastaticmethoddefgetPlace():returnPerson.placeprint(Person.getPlace())# 输出# Changsha5、构造方法和析构方法类中最常见的内置方法就是构造方法和析构方法。- 构造方法构造方法 _ _ init _ _(self, ··· ···) 在生成对象是调用可以用来进行一些属性初始化操作不需要显式去调用系统会默认执行。构造方法支持重载如果用户自己没有重新定义构造方法系统就自动执行默认的构造方法。构造方法使用示例# 构造方法使用示例classPerson:def__init__(self,name):self.PersonNamenamedefsayHi(self):print(大家好我是{}。.format(self.PersonName))pPerson(二二)p.sayHi()# 输出# 大家好我是二二。- 析构方法析构方法 _ _ def_ _(self) 在释放对象时调用支持重载可以在其中进行一些释放资源的操作不需要显式调用。下面的示例说明了类的普通成员函数以及构造方法的和析构方法的作用析构方法示例# 析构方法的示例classTest:def__init__(self):print(构造方法执行)def__del__(self):print(析构方法执行)defmyf(self):# 第一个参数必须是self代表当前实例print(调用自定义方法)# 1. 实例化Test类创建对象赋值给objobjTest()# 2. 通过实例调用myf方法obj.myf()# 3. 重赋值obj为None模拟原代码的赋值操作objNone# 4. 删除obj变量delobj# 输出# 构造方法执行# 调用自定义方法# 析构方法执行很多新手会误以为del obj一定会立刻触发__del__但其实这里有个关键del是删除变量的引用而不是直接销毁对象。只有当对象的引用计数为 0 时垃圾回收器才会销毁对象并调用__del__。6、属性和方法的访问控制- 属性的访问控制在 Python 中没有像 C 中 public 和 private 这些关键字来区别公有属性和私有属性它是以属性命名方式来区分如果在属性名前面加了两个下划线 “_ _” 则表明该属性是私有属性否则为公有属性。方法也一样如果在方法名前面加了下划线则表示方法是私有的否则为公用的。创建 Person 类调用其公有属性# 创建 Person 类调用其公有属性classPerson:name二二age21pPerson()print(p.name,p.age)# 输出# 二二 21这里的 name 和 age 都是公有的可以直接在类外通过对象名访问如果想定义成私有的则需要在前面加两个下划线 “_ _”。- 方法的访问控制在类中可以根据需要定义一些方法定义方法采用 def 关键字在类中定义的方法至少会有一个参数一般以名为 “self” 的变量作为该参数用其他名称也可以而且需要作为第一个参数下面看一个例子# 方法的访问控制使用示例classPerson:__name二二__age16defgetName(self):returnself.__namedefgetAge(self):returnself.__age pPerson()print(p.getName(),p.getAge())# 输出# 二二 16_ _ name 和 _ _ age 是类的私有属性getName 和 getAge 是类的方法。紧接着定义了实例对象 p 。如果想获得姓名、年龄的信息不能使用 p._ _ name 和 p._ _ age 直接获取必须要使用 p.getName() 和 p.getAge() 才能获取。三、面向对象的三大特性1. 封装Encapsulation核心思想隐藏对象的内部细节仅通过公开方法对外提供访问接口确保数据安全。Python 通过 “命名约定” 实现封装公开属性 / 方法默认命名如name、say_hello可直接访问。私有属性 / 方法以双下划线__开头如__secret只能在类内部访问。示例私有属性的封装classBankAccount:def__init__(self,account_id,balance):self.account_idaccount_id# 公开属性self.__balancebalance# 私有属性余额不允许直接修改# 公开方法提供安全的余额访问defget_balance(self):returnself.__balance# 公开方法提供安全的存款逻辑defdeposit(self,amount):ifamount0:self.__balanceamountprint(f存款成功当前余额{self.__balance})else:print(存款金额必须为正数)# 使用accountBankAccount(622202XXXX,1000)print(account.account_id)# 输出622202XXXX允许访问公开属性# 尝试直接访问私有属性会报错# print(account.__balance) # AttributeError: BankAccount object has no attribute __balance# 通过公开方法访问和修改print(account.get_balance())# 输出1000account.deposit(500)# 输出存款成功当前余额1500注Python 的私有属性并非绝对不可访问可通过_类名__属性名间接访问如account._BankAccount__balance但这是不推荐的 “黑魔法”违背封装原则。2. 继承Inheritance核心思想子类派生类继承父类基类的属性和方法并可扩展新功能或重写父类方法实现代码复用。1单继承一个子类只能继承一个父类Python 也支持多继承。# 父类动物classAnimal:def__init__(self,name):self.namenamedefeat(self):print(f{self.name}在吃东西)# 子类狗继承AnimalclassDog(Animal):# 通过括号指定父类# 重写父类方法Overridedefeat(self):print(f{self.name}在啃骨头)# 扩展父类的实现# 子类新增方法defbark(self):print(f{self.name}在汪汪叫)# 使用dogDog(旺财)dog.eat()# 输出旺财在啃骨头调用重写后的方法dog.bark()# 输出旺财在汪汪叫调用子类新增方法2调用父类方法通过super()函数在子类中调用父类的方法尤其是构造方法。classParent:def__init__(self,a):self.aaclassChild(Parent):def__init__(self,a,b):# 调用父类的__init__方法初始化asuper().__init__(a)# 等价于 Parent.__init__(self, a)self.bb# 子类新增属性childChild(10,20)print(child.a,child.b)# 输出10 203多继承Python 支持一个子类继承多个父类语法为class 子类(父类1, 父类2, ...)。但需注意方法解析顺序MRO当多个父类有同名方法时按子类.__mro__的顺序查找。classA:defsay(self):print(A的say方法)classB:defsay(self):print(B的say方法)classC(A,B):# 继承A和BpasscC()c.say()# 输出A的say方法按MRO顺序A在B前print(C.__mro__)# 输出(class __main__.C, class __main__.A, class __main__.B, class object)3. 多态Polymorphism核心思想不同子类对同一方法有不同实现通过父类引用调用时表现出不同行为。Python 的多态基于 “动态类型”无需显式声明类型更加灵活。# 父类形状classShape:defdraw(self):pass# 父类方法子类需重写# 子类圆形classCircle(Shape):defdraw(self):print(画圆形)# 子类矩形classRectangle(Shape):defdraw(self):print(画矩形)# 统一接口接收Shape类型或其子类defdraw_shape(shape):shape.draw()# 调用时自动匹配子类的实现# 多态体现同一接口不同实现draw_shape(Circle())# 输出画圆形draw_shape(Rectangle())# 输出画矩形写在最后刚开始学面向对象时总觉得“绕”——比如self到底是啥封装要不要严格用双下划线。后来发现不用死扣概念多写实际代码更重要先从简单的类开始比如定义Student类包含姓名、学号、选课方法自己实例化几个对象试试遇到重复代码时想想能不能用继承担心属性被乱改时试试用封装单下划线接口方法不确定方法类型时先写实例方法后续再根据需求改类方法/静态方法。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询