欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > Python面向对象

Python面向对象

2025/3/25 23:39:24 来源:https://blog.csdn.net/jsl123x/article/details/146480003  浏览:    关键词:Python面向对象

第三期也是Python基础的最后一期:

期末可看,Python数据容器复习-CSDN博客文章浏览阅读327次,点赞7次,收藏9次。上期总结了Python中最基础的语法,本贴继续总结有关数据容器的细节~ https://blog.csdn.net/jsl123x/article/details/146466664?spm=1001.2014.3001.5501简单的案例或许用结构化分析的思想即可解决,但当涉及到大规模工程时往往包含了许多代码的复用,这时我们需要用面向对象的思维来提升开发效率~

目录

一.类

二.属性和方法

三.面向对象思维

四.构造方法

五.魔术方法

六.封装

七.继承

八.多态


一.类

总的来说和Java和C++中的对象写法类似,也和结构体类似,区别还是用缩进省略了大括号。区别在于,成员属性不需要声明类型,统一声明为None类型:

class tudent:name=Noneage=Nonemajor=Nonegender=None

创建和赋值倒是没什么区别;

std1=Student()
std1.age=22
print(std1.age)

二.属性和方法

属性又称为成员变量,方法又称为成员方法。与之前不同的是:成员方法必须包含self关键字,它用来表示对象自身的意思,类比Java和JS的this关键字。当我们使用对象调用方法时,无需手动书写,self关键字会被自动传入,也即可以将self关键字当成透明的。在方法内部,如果想访问成员变量,必须通过self来调用~

class Student:name=Noneage=Nonedef hello(self):print(self.name, self.age)
std1=Student()
std1.age=22
std1.name='1325'
std1.hello()

至于外部传入的参数,则不需要self来调用~

三.面向对象思维

设计类,基于类创建对象,由对象完成具体的工作。

四.构造方法

简单来说,就是用更简易的操作为对象的成员变量赋值~

  • 命名方式:__init__()
  • 在创建对象的时候会自动执行
  • 在创建对象的时候将传入的参数自动传递给__init__方法使用

如果有了构造方法,就不需要提前定义成员变量了:

class Student:# name=None# age=None# major=None#成员变量的定义是可以直接省略的~def __init__(self,name,age,major):self.name=nameself.age=ageself.major=major
#虽然名字相同,但要分期谁才是被传入的参数
class Student:# name=None# age=None# major=None#成员变量的定义是可以直接省略的~def __init__(self,name,age,major):self.name=nameself.age=ageself.major=major
#虽然名字相同,但要分期谁才是被传入的参数
std1=Student("jsl",22,"软件工程")
print(std1.name,std1.age,std1.major)

没什么毛病:

五.魔术方法

内置的类方法,各自有各自的功能,在这里统称为魔术方法。

__str__用于将对象的地址改为自定义的字符串类型~ 

class Student:def __init__(self,name,age,major):self.name=nameself.age=ageself.major=majordef __str__(self):return f"{self.name} is {self.age} years old and study {self.major}"
std1=Student("jsl",22,"软件工程")
print(std1)

__lt__可用于用户定义自己想要的比较。对于C++来说,各位在参加算法竞赛时肯定有各种结构体型的数据需要进行排序,这时我们往往自行书写冒泡、快排等手段,内嵌的sort指望不了一点。python也同理:

class Student:def __init__(self,name,age,major):self.name=nameself.age=ageself.major=majordef __lt__(self,other):return self.age<other.agestd1=Student("jsl",22,"软件工程")
std2=Student("hyh",21,"软件工程")
print(std1>std2)
#结果显然为真

至于__le__,其实就是支持大于等于和小于等于的前者,这里就不过多赘述了~ 

而__eq__,则是判断等于的情况,大同小异,各位自行试试?

六.封装

和别的语句不同,只需要在变量或者方法前加双下滑线:__, 而不是private关键字:

class Student:def __init__(self,name,age,major):self.name=nameself.age=ageself.__major=majordef __myPrint(self):print(self.name, self.age, self.__major)
std1=Student("jsl",22,"软件工程")
# print(std1.__major)
std1.myPrint()

如果强行运行会提示报错

现实意义来说,私有变量可以供对象内部使用~

class Student:def __init__(self,name,age,major):self.name=nameself.age=ageself.__major=majordef myPrint(self):print(self.name, self.age, self.__major)
std1=Student("jsl",22,"软件工程")
std1.myPrint()

如下,myPrint可以调用私有的major成员变量:

七.继承

python中不是用extends关键字,而是将父类直接卸载子类定义的括号里面:

class TheOld():name=None
class TheNew(TheOld):age=Nonedef __init__(self,name,age):self.name=nameself.age=age
myNew=TheNew('Jack',23)
print(myNew.name,myNew.age)

也支持多重父类继承,只需要用逗号隔开:

class TheOld1():name=None
class TheOld2():major=None
class TheNew(TheOld1,TheOld2):age=Nonedef __init__(self,name,age,major):self.name=nameself.age=ageself.major=major
myNew=TheNew('Jack',23,"软件工程")
print(myNew.name,myNew.age)
  • 子类如果什么也不想新加,直接用pass解决就行~ 
  • 此外对于同名的属性或者方法,谁先来谁的优先级就高——也即在括号中谁靠前~

 子类在继承父类的成员变量之后,可以进行修改——即复写,这里演示复写方法:

class TheOld1():name=Nonedef myPrint(self):print(self.name)
class TheNew(TheOld1):age=Nonedef __init__(self,name,age):self.name=nameself.age=agedef myPrint(self):print(self.name, self.age)
myNew=TheNew('Jack',23)
myNew.myPrint()

直接用原来的名字重新书写即可:

复写之后再调用,调用的是新成员:

class TheOld1():name="111"
class TheNew(TheOld1):name="222"
myNew=TheNew()
print(myNew.name)

如果你还需要父类的成员变量,可以使用父类名来调用:

class TheOld1():name="111"
class TheNew(TheOld1):name="222"def myPrint(self):print(TheOld1.name)
myNew=TheNew()
myNew.myPrint()

更简单的方式是直接用supe关键字:

class TheOld1():name="111"
class TheNew(TheOld1):name="222"def myPrint(self):print(super().name)
myNew=TheNew()
myNew.myPrint()

效果不错:

  

八.多态

多态指的是完成某个行为时,使用不同的对象会得到不同的状态。即,以父类作为工作声明,而以子类完成具体工作(定义用父类,但实际传入子类对象~)

def colorPrint(Color):print(Color.color)
class Color:color=None
class RedColor(Color):color=(255,0,0)
class GreenColor(Color):color=(0,255,0)
Rd=RedColor()
Gr=GreenColor()
colorPrint(Rd)
colorPrint(Gr)

实际上上面的Color也即一个抽象类,因为子类继承父类成员方法,所以传参并不会报错~ 


本系列完成,3贴可以快速看懂python代码的格式~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词