1 认识类与对象
在实际的生活中,每个学生都会有一个学号,一个名字,一个年龄,一个性别等属性!学生都会有一些相同的行为,比如吃饭,睡觉。那么对于这些共有的属性和行为,我们可以把这些共有的属性和行为抽取出来,形成一个模板,这就是类!就相当于是一张图纸,而对象就是根据图纸建造出来的实体!
类的语法格式:
class 类名: 成员变量 成员方法(函数)
创建对象的格式:
对象名 = 类名()
例子如下:
class Student: name = None Id = None age = None Sex = None def Eat(self): print("共有的行为吃饭") def Sleep(self): print("共有的行为睡觉") def running(self,hour,minute,second): print(f"{self.name}的跑步时间是{hour}时{minute}分{second}秒") S1 = Student() #创建对象 #初始化对象的成员变量 S1.name = '张三' S1.Id = '001' S1.age = '18' S1.Sex = '男' #调用成员方法 S1.Eat() S1.running(0,10,10)
注意:
1️⃣只要是成员方法,那么它的第一个参数必须是self,相当于C++中的隐藏this指针
2️⃣在调用成员方法时,self是自动默认传过去的,不可以显式的传过去
3️⃣访问成员变量必须通过self去访问,否则是访问不了的
2 构造函数
创建一个对象就要一行一行的去初始化,是不是太过于麻烦了,我们可以通过构造方法来进行初始化!构造函数就是帮助我们进行对象的初始化!它会在创建的时候就会自动调用构造函数
,它的格式如下:
__(两条下划线后面也是两条下划线)init__(self,其他参数)
例子如下:
class Student: name = None Id = None age = None Sex = None def Eat(self): print("共有的行为吃饭") def Sleep(self): print("共有的行为睡觉") def running(self, hour, minute, second): print(f"{self.name}的跑步时间是{hour}时{minute}分{second}秒") #构造函数的使用 def __init__(self,name,Id,age,Sex): #构造函数里也可以定义成员变量,这样前面的成员变量也可以不用定义 self.name = name self.Id = Id self.age = age self.Sex = Sex S1 = Student("张三","001",18,"男") # 创建对象,并且自动调用构造函数 S1.Eat() S1.running(0, 10, 10)
3 常见的内置方法
在python中,对于类和对象提供了一系列内置方法供我们进行使用!在此,我们只介绍几个比较常用的内置方法,例子如下:
class Student: name = None age = None def __init__(self,name,age): self.name = name self.age =age #可以将对象中的内容以字符串的形式输出 返回一个字符串类型 def __str__(self): return f"你的名字是{self.name},你的年龄是{self.age}" #比较两个对象之间的大于或者是小于 返回值得到的是一个bool类型 def __lt__(self,other): return self.age>other.age #比较小于等于或者是大于等于 返回值是一个布尔类型 def __le__(self, other): return self.age>=other.age #用于两个类对象之间的相等比较 返回值是一个布尔类型 def __eq__(self, other): return self.age == other.age S1 = Student("张三",17) S2 = Student("李四",18) print(S1) print(S1<S2)
4 封装
和其他语言类似,如果我们不想让别人访问到类中的成员变量或者是成员方法,在python中,我们可以在成员变量名或者是成员函数名前面加上两条下划线!通过这种方法来实现对某些成员变量和方法的封装!
例子如下:
这样的成员变量和成员方法,通过外部是访问或者调用不到的,但是我们可以通过写一个外部访问的到的成员函数来访问私有的成员变量或者是私有的方法!
5 继承
简单来说,继承就是一个类去继承了另一个类的成员变量和成员方法。去继承的类叫做子类,被继承的类一般被称为父类
语法如下: class 子类类名(父类1,父类2……): 成员变量 成员方法
举个简单的例子如下所示:
class people: age = 10 sex = "男" def running(self): print("会跑步") class fish: length = 10 age = 1 def swim(self): print("会游泳") class robot(people,fish): height = 1 weight = 1 robot1 = robot() robot1.running() robot1.swim() print(robot1.age)
关于继承有以下几个特点:
1️⃣继承可以有单继承也可以有多继承,多继承就是继承的父类不止有1个
2️⃣在继承中,可以通过子类对象来调用父类的成员变量和成员函数
3️⃣在多继承中,如果存在几个父类有相同的成员变量和成员函数,并且子类中没有这种成员变量和函数!那么就会根据继承的优先顺序(从左往右继承的优先级递减),来调用父类中的成员变量或者是成员函数!
4️⃣如果子类使用父类的成员变量或者是成员函数就已经足够了,我们可以使用pass语句来实现语法的填补!
有人认为父类的成员变量或者是成员方法写的并不够太好啊,此时我们就可以通过在子类中定义和父类一样同名的成员变量和成员函数,这就叫做复写,也就可以实现自己想要得到的成员变量和成员方法了
class father: set = '父类成员变量' def test(self): print("父类成员函数") class son(father): set = '子类成员变量' def test(self): print("子类成员函数") son1 = son() print(son1.set) son1.test()
复写之后是否还可以进行调用父类的成员变量或者是成员函数嘛!当然可以继续使用父类中的成员变量和成员函数
在子类中去调用父类的成员变量和成员方法:
方式一:父类名.成员变量/父类名.成员函数(self) 注:这里的self一定要显式的加上
方式二:super().成员变量/super().成员函数()
class father: set = '父类成员变量' def test(self): print("父类成员函数") class son(father): set = '子类成员变量' def test(self): #方式一 print(father.set) father.test(self)#调用父类的成员方法 #方式二 print(super().set) super().test()#调用父类的成员方法 son1 = son() print(son1.set) son1.test()
6 类型注解
所谓的类型注解,就是我们可以显式的定义变量,可以让pycharm快速的识别到这个是什么类型的,这样就可以调用这种类型对应的操作
#变量的类型注解 var_1:int = 1 var_2:str = 'abc' #说明列表中全是整形 var_3:list[int] = [1,2,3,4] #元组中设置类型详细注解,可以一一标注起来 var_4:tuple[str,int,int]=('abc',11,234) #字典中进行类型注解,一个标注key,另一个标注value var_5:dict[str,str]={"name":"张三"} #自定义类型 var_6:student = student()
#函数的类型注解 def test(s1:int) -> int: #-> int 表明返回值的类型 return 10 print(test(2))
#Union联合注解 #导包 from typing import Union #Union 联合类型注解 #说明key都是str类型,vakue是str或者是int类型 var_1:dict[str,Union[str,int]] ={"name":"张三","age":20} def test() ->Union[int,str]: #返回类型是int或者是str return 'str'
7 多态
简单来说多态就是传入不同的类对象,调用同一方法,而表现出不同行为的特点
class Animal: #父类的方法中不做具体实现,具体的实现交给子类去实现,这个叫做抽象方法,所在的类就是抽象类 def speak(self): pass class cat(Animal): def speak(self): print("猫会喵喵喵") class dog(Animal): def speak(self): print("狗会汪汪汪") def fun(animal:Animal): animal.speak() dog = dog() cat = cat() fun(dog) fun(cat)
甚至可以不在继承关系中,也就是我们所说的鸭子类型,只要该类对象中实现了一样的方法可以进行调用
class Animal: def speak(self): pass class cat(Animal): def speak(self): print("猫会喵喵喵") class dog(Animal): def speak(self): print("狗会汪汪汪") def fun(animal:Animal): animal.speak() class Duck: def speak(self): print("gagaga") dog = dog() cat = cat() Duck = Duck() fun(dog) fun(cat) fun(Duck)