上一篇我们介绍了python中的库 ,学习了一些常见的内置库。详细内容可点击–>python学习笔记14 python中的库,常见的内置库(random、hashlib、json、时间、os)
这一篇我们来看一下python中的类
创建一个类
class 类的名称():
def __init__(self,参数1,参数2,...):
代码块1
def 方法名1(参数3,参数4,...):
代码块2
def 方法名2(参数5,参数6,...):
代码块3
...
#特别注意:class类中的函数,
# 必须要有一个参数,且是第一个定义,self
#self: 表示当前调用该方法的对象
# 定义一个类
class Person:
def eat(self):
print("吃饭")
def call(self,name):
print(f"打电话给{name}")
通过一个类创建一个对象
class Person:
def eat(self):
print("吃饭")
def call(self,name):
print(f"打电话给{name}")
# 相当于创建一个Person类的对象,将对象的地址值赋值给变量p1
p1 = Person()
p1.eat() #吃饭
p1.call('王子奇') #打电话给王子奇
通过一个类创建多个对象
class Person:
def eat(self):
print("吃饭")
def call(self,name):
print(f"打电话给{name}")
# 相当于创建一个Person类的对象,将对象的地址值赋值给变量p1
p1 = Person()
p1.eat() #吃饭
p1.call('王子奇') #打电话给王子奇
print("----------------------------")
p2 = Person() # 在内存中开辟一个新的空间
p2.eat() #吃饭
p2.call('王俊凯') #打电话给王俊凯
print(id(p1)==id(p2)) # False 地址值不同
给对象赋予属性
- 类中不写,创建对象的之后,单独为该对象创建新的属性
class Person:
def eat(self):
print("吃饭")
def call(self,name):
print(f"打电话给{name}")
p1 = Person()
p1.name = '小虎'
print(f"p1对象的姓名为:{p1.name}")
p2 = Person() # 在内存中开辟一个新的空间
# print(f"p1对象的姓名为:{p2.name}") # 报错
- 类中编写,创建对象的时候,直接就拥有了某个属性,并且可以直接赋值
class Person:
def __init__(self,name):
# self.name 定义一个类中的属性,叫做name
self.name = name
def eat(self):
print("吃饭")
def call(self,name):
print(f"打电话给{name}")
# 使用类名() 的方式创建对象,实际上底层调用的是类中的__init__(self)
# 若自己没写,默认一个类中有一个__init__(self),且只能有一个
p1 = Person('小虎')
print(f"p1对象的姓名为:{p1.name}") #p1对象的姓名为:小虎
p2 = Person('张三')
print(f"p2对象的姓名为:{p2.name}") #p2对象的姓名为:张三
练习题:
手机:
属性: 品牌, 价格, 颜色
行为:打电话, 发短信
class Phone():
def __init__(self,brand,price,color):
self.brand=brand
self.price=price
self.color=color
def call(self,name):
print(f"正在打电话给{name}...")
def send_message(self,name,text):
print(f"给{name}发短信了,短信内容是:{text}")
if __name__ == '__main__':
p1=Phone('HUAWEI',9999,"宝石蓝")
p1.call('王俊凯')
p1.send_message('王俊凯','你什么时候开演唱会')
p2=Phone('XIAOMI',5999,"钻石白")
p1.call('王子奇')
p1.send_message('王子奇', '和黄景瑜在拍一个剧吧')
类的继承
继承是将多个类中的相同的部分,单独提取到一个类中,这些类于单独提出来的这个类产生一个关系,这个关系,就叫做继承关系,其他类中也就拥有了相同的部分,不需要特地定义出来。
通过继承,子类拥有了父类中的成员。
class 父类:
pass
class 子类(父类):
pass
class Student:
def __init__(self,id,name,age):
self.id=id
self.name=name
self.age=age
def __str__(self):
return f'Student:({self.id},{self.name},{self.age})'
def study(self):
print(f'{self.name}在学习')
def play(self):
print(f'{self.name}在玩')
class PrimaryStudent(Student):
pass
class HighStudent(Student):
pass
stu1=PrimaryStudent('20240001','图图',8)
stu1.study()
stu1.play()
stu2=HighStudent('20240002','莉莉',15)
stu2.study()
stu2.play()
特别注意:
-
子类无法继承父类中私有的成员
class Fu: def fun1(self): print("好好学习,天天向上!") def __fun2(self): print("这是父类中私有的成员函数__fun2") class Son(Fu): pass s1 = Son() s1.fun1() s1.__fun2()
-
若子类中出现与父类的函数名以及函数参数都一样,只是实现不一样的情况,子类对象调用的是自己的函数
class Fu: def fun1(self): print("好好学习,天天向上!") def __fun2(self): print("这是父类中私有的成员函数__fun2") def fun3(self): self.__fun2() class Son(Fu): def fun1(self): print("这是子类中的函数fun1") pass s1 = Son() s1.fun1()
-
子类中可以定义父类中没有的成员属性
class Fu: def __init__(self,name,age): self.name = name self.age = age class Zi(Fu): def __init__(self, name, age, sid): super().__init__(name,age) self.sid = sid z1 = Zi('张三',18, 1001) print(z1.name,z1.age,z1.sid) #张三 18 1001
-
子类继承父类的同时,可以出现父类中没有的行为
class Fu2: def fun1(self): print("shujia") class Zi2(Fu2): def show(self): print("shujia666") # d1 = Fu2() # d1.fun1() # d1.show() #报错 d2 = Zi2() d2.fun1() d2.show()
-
子类中可以使用super()来调用父类中非私有的成员
class Fu: def fun1(self): print("这是父类中的fun1") class Zi(Fu): def fun1(self): print("这是子类中的fun1") def show(self): self.fun1() # 调用的是子类中重写后的fun1函数 # 调用父类中的fun1 super().fun1() z = Zi() z.show()
-
在python中一个类可以同时继承多个类
class Fu: def fun1(self): print("这是父亲中的函数fun1") class Mather: def fun2(self): print("这是母亲中的函数fun2") class Son(Fu, Mather): def fun3(self): print("这是儿子自己的函数") s1 = Son() s1.fun1() s1.fun2() s1.fun3()
若同时继承的类中有相同的函数名,谁先写就调用谁的
class Fu: def fun1(self): print("这是父亲中的函数fun1") def show(self): print("这是父亲中的函数show") class Mather: def fun2(self): print("这是母亲中的函数fun2") def show(self): print("这是母亲中的函数show") class Son(Mather,Fu): def fun3(self): print("这是儿子自己的函数") s1 = Son() s1.fun1() s1.fun2() s1.fun3() s1.show() # 调用的是母亲中的show
多态
表示的是某一个事物在不同时刻下的不同状态
在python中默认支持多态,因为python是动态数据类型语言。
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"name:{self.name}, age:{self.age}"
def eat(self):
print("吃")
def sleep(self):
print("睡")
#抽象
class Dog(Animal):
pass
a1 = Animal('小黄',2)
a1 = Dog('小黑',3)
print(a1) #name:小黑, age:3
抽象
from abc import abstractmethod
# from typing import override
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"name:{self.name}, age:{self.age}"
@abstractmethod
def eat(self):
pass
@abstractmethod
def sleep(self):
pass
class Dog(Animal):
# @override
def eat(self):
print("🐕吃🥩")
# @override
def sleep(self):
print("🐕趴着睡")
# a1 = Animal('小黄',2)
a1 = Dog('小黑',3)
a1.eat() #🐕吃🥩
a1.sleep() #🐕趴着睡
类变量
将变量定义在类中函数外
class Demo1:
# 类变量
a = 100
def fun1(self):
a = 10
print(a)
print(Demo1.a) # 通过类名直接访问
d1 = Demo1()
d1.fun1()
print(d1.a) # 也可以通过对象名进行访问
下一篇我们来几个关于类的练习题结束我们python的基础语法内容啦。
我们即将进入python的进阶内容,数据分析numpy、pandas、matplotlib的学习!
点赞收藏关注,一起打卡python学习吧