? ? ? ? 小伙伴们好久不见,本期我们了解一下Python中面向对象的一些基础知识,为以后的上位机学习做下基础,因为前面我们对c语言进行了系统学习,所以Python基础知识我们就不做阐述了,逻辑基本相同,就是书写的格式有所差别。本期内容简洁明了,主要展示示例代码。
"""
定义类格式:
# Python3以后,3种写法完全等价
#class 类名:
#class 类名():
class 类名(object): # 新式类写法,object所有类的祖先
方法的定义
注意:类名 建议 大驼峰命名法
类的设计
类名: 人类(Person)
属性: 无
方法: 吃饭(eat)/运动(run)
1. 定义类,只是定义了一个类型
2. 根据类创建对象(实例化对象), 通过设计图创建一个实物
格式: 实例对象变量名 = 类名() # 小括号一定不能省略
3. 类外面方法如何调用
对象变量.方法名字()
"""
class Person():
def eat(self):
print(f"{self.name}吃饭")
P = Person()
P.name = "mike"
P.eat()
"""
在类的外面操作对象属性:
1. 创建对象变量(实例化对象)
2. 添加属性:对象.属性 = 内容
注意:
1. 第一赋值叫添加属性,下一次赋值叫修改属性
2. 类外添加属性,了解即可
3. 使用属性:对象变量.属性
"""
class Person():
def eat(self):
print(f"{self.name}吃饭")
P = Person()
P.name = "mike"
P.eat()
"""
1. self是什么?
谁调用方法,self就是那个谁
tom对象调用eat方法,self就是tom对象
2. 如何访问属性和方法
类方法里面: self.属性、self.方法()
类外面: 对象变量名.属性、对象变量名.方法()
"""
lass Person():
def eat(self):
print(f"{self.name}吃饭")
P = Person()
P.name = "Mike"
P.eat()
"""
__init__方法(双下划线,不是单下划线):
1. 作用:初始化,添加属性
self.属性变量名 = 内容
2. 特点:创建对象的时候,实例化对象,自动调用__init__方法
类名:Person
属性:name
方法:
__init__(): 添加属性,属性内容为'小明'
eat(): 打印xx爱吃饭, xx替换为具体的属性
"""
class Person():
def __init__(self):
self.name = "mike"
def eat(self):
print(f"{self.name}在吃饭")
P = Person()
P.eat()
"""
__init__方法(双下划线,不是单下划线):
1. 作用:添加属性
2. 特点:创建对象的时候,实例化对象,自动调用__init__方法
3. 设置参数,创建对象时,除了self参数不用人为处理,其它参数需要和__init__参数匹配
对象名 = 类名(实参1, 实参2) ====》 __init__(self, 形参1, 形参2)
"""
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name}在吃饭,{self.age}岁了")
P = Person("mike",18)
P.eat()
"""
__str__方法:
0. 作用:方便打印对象的属性信息
1. 返回值必须是字符串类型,不是返回print
2. print(对象变量名) 对象变量名的位置替换为__str__()方法返回值的内容
"""
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name}在吃饭,{self.age}岁了")
def __str__(self):
return f"姓名:{self.name},年龄:{self.age}"
P = Person("mike",18)
P.eat()
print(P)
"""
需求:
1. 房子(House) 有 户型、 总面积、剩余面积 和 家具名称列表
- 新房子没有任何的家具、剩余面积和总面积相等
2. 家具(HouseItem) 有 家具名字 和 家具面积, 其中
- 席梦思(bed) 占地 4 平米
- 衣柜(chest) 占地 2 平米
- 餐桌(table) 占地 1.5 平米
3. 将以上三件 家具 添加 到 房子 中
- 向房间 添加家具 时, 让 剩余面积 -= 家具面积
4. 打印房子时, 要求输出: 户型、 总面积、 剩余面积、 家具名称列表
家具类
类名:HouseItem
属性:家具名称name、家具面积area
方法:
__init__(): 添加属性
__str__(): 以字符串格式返回属性信息
房子类
类名:House
属性:户型house_type、 总面积area、剩余面积free_area 和 家具名称列表item_name_list
方法:
__init__(): 添加属性
__str__(): 以字符串格式返回属性信息
add_item(): 添加家具,需要一个形参house_item接收家具对象
"""
# 家具类
class HouseItem():
def __init__(self,name,area):
self.name = name
self.area = area
def __str__(self):
return f"名称:{self.name},面积:{self.area}"
# 房子类
class House():
def __init__(self,house_type,area):
self.house_type = house_type
self.area = area
self.free_area = area
self.item_name_list = []
def __str__(self):
return f"户型:{self.house_type},面积:{self.area},剩余面积:{self.free_area},家具名称列表:{self.item_name_list}"
def add_item(self,temp:HouseItem):
if self.free_area >= temp.area:
print(f"添加家具{temp.name}成功,面积为{temp.area}平米")
self.free_area -= temp.area
self.item_name_list.append(temp.name)
else:
print(f"添加家具{temp.name}失败,剩余面积不足")
H = House("四居室",100)
# 席梦思(bed) 占地 4 平米
bed = HouseItem("bed",4)
print(bed)
H.add_item(bed)
print(H)
# 衣柜(chest) 占地 2 平米
chest = HouseItem("chest",2)
print(chest)
H.add_item(chest)
print(H)
# 餐桌(table) 占地 1.5 平米
table = HouseItem("table",1.5)
print(table)
H.add_item(table)
print(H)
"""
说明: 当属性和方法只需要在类定义内部使用时, 就可以使用私有属性和私有方法
定义格式:
私有属性: __属性名
私有方法: def __方法名():
女孩类:
类名:Girl
实例属性:
姓名name
年龄__age
实例方法:
__init__() 添加实例属性
__secret() 打印年龄
use_private() 公共方法
"""
class Girl():
def __init__(self,name,age):
self.name = name
self.__age = age
def __secret(self):
print(self.__age)
def use_private(self):
self.__secret()
g = Girl("小明",18)
print(g.name)
g.use_private()
"""
需求:
? 进入某 Web 项目登录页面, 输入用户名、 密码、 验证码之后登录系统
要求:
? 用户名为'admin',密码为'123abc',验证码为:'abcd',返回登陆成功,否则,返回登陆失败
类名:LoginPage
实例属性:用户名username、密码password、验证码verify_code
实例方法:
__init__(): 添加属性
__str__(): 返回字符串格式的属性信息
login(): 登陆
"""
class LoginPage():
def __init__(self,username,password,verify_code):
self.username = username
self.password = password
self.verify_code = verify_code
def __str__(self):
return f"用户名:{self.username}\n密码:{self.password}\n验证码:{self.verify_code}\n"
def login(self):
if self.username == "admin" and self.password == "123abc" and self.verify_code == "abcd":
return "登陆成功"
else:
return "登陆失败"
lp = LoginPage("admin","123abc","abcd")
print(lp)
res = lp.login()
print(f"登录结果:{res}")
"""
继承:复用代码,继承过来的东西可以复用,描述类和类之间的关系
格式:
class 子类名(父类名):
pass
# 父类,也叫基类
# 子类,也叫派生类
父类名:Person
实例属性:name, age
实例方法:
__init__() 添加实现属性
say_hello() 打印 xxx say hello,今年 xxx 岁
子类名:Student 继承于 Person类
类里面没有实现任何功能
"""
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
def say_hello(self):
print(f"姓名:{self.name},年龄:{self.age}")
class Student(Person):
pass
s = Student("mike",18)
s.say_hello()
"""
重写:重新写(定义)一次父类的同名方法
为什么需重写:父类同名方法不满足需求
子类如何调用父类同名方法:super().父类同名方法(参数)
父类名:Person
实例属性:name, age
实例方法:
__init__() 添加实现属性
say_hello() 打印 xxx say hello,今年 xxx 岁
子类名:Student 继承于 Person类
实例属性:新增score
实例方法:
重写__init__()方法:调用父类的__init__,再增加score
go_school(): 打印: xxx 去考试,得分:xxx
"""
class Person():
def __init__(self,name,age):
self.name = name
self.age = age
def say_hello(self):
print(f"姓名:{self.name},年龄:{self.age}")
class Student(Person):
def __init__(self,socre,name,age):
super().__init__(name,age)
self.socre = socre
def goto_school(self):
print(f"{self.name} 去考试,得分:{self.socre}")
s = Student(90,"mike",20)
s.goto_school()
s.say_hello()