类属于一种严格设计图纸,只有设计图纸出现,我们才能设计一个物品(对象),物品会有一定差别
class
class类 类中可以定义方法和变量
class 类名称:
类属性(成员变量)
类行为(成员行为)
对象 = 类名称()- 在程序中设计表格,我们称之为:设计类(class) 设计类:
class Students:
name = None
gender = None
age = None
number = None- 在程序中打印生产表格,我们称之为创建对象: 基于类创建对象:
# 承接上文
stu_1 = Students()
stu_2 = Students()- 在程序中填写表格,我们称之为对象属性赋值: 对象属性赋值:
# 承接上文
stu_1.name = "张三"
stu_2.name = "李四"成员函数
def 方法名(self,...)
类外叫函数,类内叫方法,self基本可以忽略,其他功能跟函数基本相同
class Student:
name = None
def say_hi(self):
print("你好")
stu1 = Student()
stu1.say_hi() # output:你好self
self = this->
访问成员属性必须用self
class Biancheng:
Python = python
Java = java
def say_hw(self):
print({self.Python})
def say_hw2(self):
print(self.Java)
bian = Biancheng()
bian.say_hw() # output:python
bian.say_hw2() # output:java__init__():
构造方法,相当于cpp中构造函数 在创建类时自动执行 在创建对象将参数自动传递给__init__方法使用
class Students:
# 已在__init__中写了成员变量,则成员变量以定义成功,以下四行可以不写
stu_name = None
stu_gender = None
stu_age = None
stu_number = None
def __init__(self, name, age, gender):
self.stu_name = name
self.stu_age = age
self.stu_gender = gender
print(f"{self.stu_name} {self.stu_age} {self.stu_gender}")
stu1 = Student("张三", 18, '男') # output:张三 18 男内置方法
__str__
__str__魔术方法
控制字符串转化行为
class Students:
def __init__(self, name, age, gender):
self.stu_name = name
self.stu_age = age
def __str__(self):
return f"Students类对象中name:{self.name}, age:{self,age}"
stu = Students("张三", 18)
print(stu)
print(str(stu))
# output:
# Students类对象中name:张三, age:18 # 没有转格式,也被替换成字符串
# Students类对象中name:张三, age:18__lt__
__lt__魔术方法
和 符号比较方法,类似cpp运算符重载
class Students:
def __init__(self, name, age, gender):
self.stu_name = name
self.stu_age = age
def __lt__(self, other):
return self.stu_age < other.stu_age
stu1.Students("张三", 18)
stu2.Students("李四", 20)
print(stu1 < stu2)
# output: True__le__
__le__魔术方法
比较符号重载
class Students:
def __init__(self, name, age, gender):
self.stu_name = name
self.stu_age = age
def __lt__(self, other):
return self.stu_age <= other.stu_age
stu1.Students("张三", 18)
stu2.Students("李四", 20)
print(stu1 <= stu2)
print(stu1 >= stu2)
# output:
# True
# False__eq__
__eq__魔术方法
比较符号重载
不实现__eq__方法时,对象之间可以比较,但比较的是内存地址,即:不同对象比较一定为错
实现__eq__方法时,按自己的想法决定比较方式
class Students:
def __init__(self, name, age, gender):
self.stu_name = name
self.stu_age = age
def __eq__(self, other):
return self.stu_age == other.stu_age
stu1.Students("张三", 18)
stu2.Students("李四", 18)
# 不实现
print(stu1 == stu2) # output:False
# 实现
print(stu1 == stu2) # output:True面向对象三大特性
封装
私有变量:在方法或变量前加两个__下划线
内部成员自己使用,设计不直接对用户开放的行为
class Phone:
# 当前手机运行电压
__current_voltage = 1
#
def __keep_single_core(self):
print("让CPU单核运行")
#
def call_by_5g(self):
if self.__current_voltage >= 1:
print("5G通话已开启")
else:
self.__keep_single_core()
print("电量不足,已设为单核运行")
phone1 = Phone()
phone1.__keep_single_core() # output:报错
print(phone1.__current_voltage) # output:报错
phone1.call_by_5g() # output:5G通话已开启封装设计案例
指向原始笔记的链接 class Phone: __is_5g_enable = False # def __check_5g(self): if self.__is_5g_enable: print("5g开启") else: print("5g关闭") # def call_by_5g(self): self.__check_5g() print("通话中") phone = Phone() phone.call_by_5g() # output:5g关闭 通话中
继承
与cpp基本相同 多继承时如果有访问同名变量,位于括号左边的父类优先被访问
继承设计案例
单继承
class Phone: IMEI = None # 序列号 producer = 'HM' # 厂商 # def call_by_5g(self): print("5g通话") class Phone2022(Phone): # python继承语法 face_id = "10001" # def call_by_6g(self): print("6g通话") phone = Phone2022() print(phone.producer) # output:HM 继承的东西可直接使用 phone.call_by_5g() # output:5g通话 phone.call_by_6g() # output:6g通话多继承
指向原始笔记的链接 class Phone: IMEI = None # 序列号 producer = 'XM' # 厂商 # def call_by_5g(self): print("5g通话") class Phone2022(Phone): # python继承语法 face_id = "10001" # def call_by_6g(self): print("6g通话") class NFCReader: nfc_type = "第五代" producer = "HM" # def read_card(self): print("NFC读") # def write_card(self): print("NFC写") class RemoteControl: rc_type = "红外遥控" def control(self): print("红外遥控开启") class MyPhone(Phone, NFCReader, RemoteControl): pass # output:继承后跳过 phone = MyPhone() phone.call_by_5g() # output:5g通话 phone.read_card() # output:NFC读 phone.write_card() # output:NFC写 phone.control() # output:红外遥控开启 print(phone.producer) # output:XM 多继承左优先
pass
pass
占位语句,补全语法完整性
class Father:
pass
# 空实现子类复写
对父类不满意的成员重新赋值 即覆盖重写
class Father:
producer = "Apple"
class Son(Father):
producer = "Huawei"
phone = Son()
print(phone.producer) # output: Huawei 成员方法同理重新调用父类
方式一,直接用父类
# 将用到self的地方用父类名代替
# 承接上文
print(Father.producer) # output:Apple 成员方法同理方式二
super
super().成员变量/成员方法()
# 承接上文
print(super().producer) # output:Apple多态
与cpp基本相同
多态设计案例
# 类似cpp中的virtual class Animal: def speak(self): pass class Dog(Animal): def speak(self): print("wangwang") class Cat(Animal): def speak(self): print("miaomiao") def sound(animal: Animal): animal.speak() dog = Dog() cat = Cat() sound(dog) sound(cat) # output: # wangwang # miaomiao抽象类
指向原始笔记的链接 class AC: def cool_wind(self): pass # def hot_wind(self): pass # def swing_l_r(self): pass class Midea_AC(AC): def cool_wind(self): print("美的冷风") # def hot_wind(self): print("美的热风") # def swing_l_r(self): print("美的摇头") class Gree_AC(AC): def cool_wind(self): print("格力冷风") # def hot_wind(self): print("格力热风") # def swing_l_r(self): print("格力摇头")