目录
一、类和对象
类中创建函数的时候,必须要加self,当在函数中调用类中成员属性的时候,就要使用self了
class Student:
name = None
def say_hi(self):
print(f"大家好,我是{self.name}")
def say_hi2(self,msg):
print(f"大家好,我的{self.name},{msg}")
s1 = Student()
s2 = Student()
s1.name = '张三'
s1.say_hi() # 大家好,我是张三
s2.name = '李四'
s2.say_hi2("很高兴认识你们") # 大家好,我的李四,很高兴认识你们
# 闹钟
class Clock:
id = None # 序列号
piece = None # 价格
def ring(self):
import winsound
winsound.Beep(2000, 3000) # 频率和时间
c = Clock()
c.id = '03003'
c.piece = 1832
c.ring()
二、魔术方法
内置的类方法,各有各的特殊功能,这些内置的方法称为魔术方法
常见的魔术方法有:
构造方法
class Person:
# name = None
# age = None
# gender = None
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
print(f"姓名:{self.name},年龄:{self.age},性别:{self.gender}")
p = Person('张三', 18, '男') # 姓名:张三,年龄:18,性别:男
字符串方法
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"姓名:{self.name},年龄{self.age}"
p = Person("张三", 18)
print(p)
print(str(p))
# 没有使用字符串方法的输出
# <__main__.Person object at 0x000001D3A2713950>
# <__main__.Person object at 0x000001D3A2713950>
# 使用了字符串方法的输出
# 姓名:张三,年龄18
# 姓名:张三,年龄18
小于比较方法
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age
p1 = Person("张三", 18)
p2 = Person("李四", 20)
if p1 < p2:
print(f"{p1.name}比{p2.name}小")
elif p1 == p2:
print(f"{p1.name}和{p2.name}一样大")
else:
print(f"{p1.name}比{p2.name}大")
小于等于比较方法
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __le__(self, other):
return self.age <= other.age
p1 = Person("张三", 18)
p2 = Person("李四", 20)
if p1 <= p2:
print(f"{p1.name}比{p2.name}小或者一样大")
else:
print(f"{p1.name}比{p2.name}大")
等于比较方法
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
return self.age == other.age
p1 = Person("张三", 20)
p2 = Person("李四", 20)
if p1 == p2:
print(f"{p1.name}和{p2.name}一样大")
else:
print(f"{p1.name}和{p2.name}不一样大")
封装练习
class Phone:
__is_5G_enable = False
def __check_5g(self):
if(self.__is_5G_enable):
print("5g开启")
else:
print("5g关闭,使用4g网络")
def call_by_5g(self):
self.__check_5g()
print("正在通话中")
p = Phone()
p.call_by_5g()
三、继承
继承语法
class 子类(父类):
多继承语法
class 子类(父类1,父类2......父类n):
注意,父类中有同名属性,优先级从左到右
四、复写
子类继承父类的成员属性和成员方法后,如果对其不满意,那么可以进行复写
即在子类中重新定义同名属性或方法即可
在复写父类中的属性或方法后,还要在子类中调用父类的同名属性和方法,需要使用父类名.属性或者super.属性的方法
五、类型注解
变量类型注解
定义一个函数,接收一个参数data,会发现在调用函数的时候,pycharm不会做出任何提示,因为pycharm不能确定这个data是什么类型的
可以用冒号可以对进行类型注解,也可以在注释里面进行类型注解
# 基础数据类型注解
import random
val1: int = 10
val2: str = "张三"
val3: bool = True
# 类对象类型注解
class Person:
pass
p: Person = Person()
# 基础容器类型注解
my_list: list = [1, 2, 3]
my_tuple: tuple = (1, 2, 3)
my_dict: dict = {"张三": 18}
# 容器类型详细注解
my_list2: list[int] = [1, 2, 3]
my_tuple2: tuple[int, str, bool] = (1, "张三", True)
my_dict2: dict[str, int] = {"张三": 18}
# 在注释中进行类型注解
import json
val4 = random.randint(1, 10) # type: int
val5 = json.loads('{"name", 18}') # type: dict[str, int]
# 类型注解的限制
上面只是说明了语法,实际操作中,一眼便能看出来类型的不用写注解,无法直接看出变量类型的时候会添加变量的类型注解
函数和方法类型注解
Union类型注解
Union(x,y)表示可以是x类型也可以是y类型,具体用法如下图
六、多态
class Animal:
def speak(self):
pass
def eat(self):
pass
class Dog(Animal):
def speak(self):
print("小狗在说话")
def eat(self):
print("小狗在吃饭")
class Cat(Animal):
def speak(self):
print("小猫在说话")
def eat(self):
print("小猫在吃饭")
def Speak(animal: Animal):
animal.speak()
def Eat(animal: Animal):
animal.eat()
dog = Dog()
cat = Cat()
Speak(dog) # 小狗在说话
Eat(cat) # 小猫在吃饭