类属于一种严格设计图纸,只有设计图纸出现,我们才能设计一个物品(对象),物品会有一定差别

class

class类 类中可以定义方法和变量

class 类名称:
	类属性(成员变量)
	
	类行为(成员行为)
 
对象 = 类名称()
  1. 在程序中设计表格,我们称之为:设计类(class) 设计类:
class Students:
	name = None
	gender = None
	age = None
	number = None
  1. 在程序中打印生产表格,我们称之为创建对象: 基于类创建对象:
# 承接上文
stu_1 = Students()
stu_2 = Students()
  1. 在程序中填写表格,我们称之为对象属性赋值: 对象属性赋值:
# 承接上文
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

python面向对象设计案例 > 类设计案例

__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("格力摇头")
指向原始笔记的链接