第三期也是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代码的格式~