Python面向对象

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

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

目录

一.类

二.属性和方法

三.面向对象思维

四.构造方法

五.魔术方法

六.封装

七.继承

八.多态


一.类

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

java 复制代码
class tudent:
    name=None
    age=None
    major=None
    gender=None

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

python 复制代码
std1=Student()
std1.age=22
print(std1.age)

二.属性和方法

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

python 复制代码
class Student:
    name=None
    age=None
    def hello(self):
        print(self.name, self.age)
std1=Student()
std1.age=22
std1.name='1325'
std1.hello()

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

三.面向对象思维

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

四.构造方法

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

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

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

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

没什么毛病:

五.魔术方法

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

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

python 复制代码
class Student:
    def __init__(self,name,age,major):
        self.name=name
        self.age=age
        self.major=major
    def __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也同理:

python 复制代码
class Student:
    def __init__(self,name,age,major):
        self.name=name
        self.age=age
        self.major=major
    def __lt__(self,other):
        return self.age<other.age

std1=Student("jsl",22,"软件工程")
std2=Student("hyh",21,"软件工程")
print(std1>std2)
#结果显然为真

至于__le__,其实就是支持大于等于和小于等于的前者,这里就不过多赘述了~
而__eq__,则是判断等于的情况,大同小异,各位自行试试?

六.封装

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

python 复制代码
class Student:
    def __init__(self,name,age,major):
        self.name=name
        self.age=age
        self.__major=major
    def __myPrint(self):
        print(self.name, self.age, self.__major)
std1=Student("jsl",22,"软件工程")
# print(std1.__major)
std1.myPrint()

如果强行运行会提示报错

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

python 复制代码
class Student:
    def __init__(self,name,age,major):
        self.name=name
        self.age=age
        self.__major=major
    def myPrint(self):
        print(self.name, self.age, self.__major)
std1=Student("jsl",22,"软件工程")
std1.myPrint()

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

七.继承

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

python 复制代码
class TheOld():
    name=None
class TheNew(TheOld):
    age=None
    def __init__(self,name,age):
        self.name=name
        self.age=age
myNew=TheNew('Jack',23)
print(myNew.name,myNew.age)

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

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

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

python 复制代码
class TheOld1():
    name=None
    def myPrint(self):
        print(self.name)
class TheNew(TheOld1):
    age=None
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def myPrint(self):
        print(self.name, self.age)
myNew=TheNew('Jack',23)
myNew.myPrint()

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

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

python 复制代码
class TheOld1():
    name="111"
class TheNew(TheOld1):
    name="222"
myNew=TheNew()
print(myNew.name)

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

python 复制代码
class TheOld1():
    name="111"
class TheNew(TheOld1):
    name="222"
    def myPrint(self):
        print(TheOld1.name)
myNew=TheNew()
myNew.myPrint()

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

python 复制代码
class TheOld1():
    name="111"
class TheNew(TheOld1):
    name="222"
    def myPrint(self):
        print(super().name)
myNew=TheNew()
myNew.myPrint()

效果不错:

八.多态

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

python 复制代码
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代码的格式~

相关推荐
Tadecanlan6 分钟前
[C++面试] 你了解视图吗?
开发语言·c++
You can do more17 分钟前
Qt Concurrent 并发 Map 和 Map-Reduce
开发语言·qt
CSUC33 分钟前
【Qt】QByteArray详解
开发语言·qt
zhyoobo38 分钟前
使用 Python 训练自己的 AI 模型:从数据预处理到深度学习
人工智能·python·深度学习
Unlimitedz38 分钟前
歌曲缓存相关功能
开发语言·ios·缓存·swift
东方韡璟39 分钟前
Objective-C语言的数据可视化
开发语言·后端·golang
染指11101 小时前
53.第二阶段x86游戏实战2-c++实现自动打怪2
开发语言·c++·游戏·游戏逆向
hylreg1 小时前
ROS2 部署大语言模型节点
人工智能·python·语言模型
十八只兔1 小时前
Jupyter Notebook :美化读取到的JSON格式的数据(以表格形式呈现)
python·jupyter·json·tabulate·python数据读取