class Student():
name = None
age = None
# __init__ 相当于Java的构造方法,用于外部在创建对象时传参数
# 使用了__init__ 函数定义了有参构造,类在创建对象时就必须要传入了
def __init__(self, name, age):
self.name = name
self.age = age
def say(self):
print("my name is %s, i am %d years old" %(self.name, self.age))
s1 = Student("Tom", 18)
s1.say()
s2 = Student("Jerry", 20)
s2.say()
封装
# 将成员变量或方法私有化,两个下划线
class Person:
#私有变量
__python = None
name = None
__age = None
def get_age(self):
return self.__age
def set_age(self, age):
if age > 0:
self.__age = age
else:
print("年龄不合法")
def __function(self):
print("私有方法")
p = Person()
p.name = "张三"
p.set_age(10)
print(p.name,p.get_age())
# p.function()
#小练习
class Phone:
__flag = False
#改变私有变量数值的函数
def set_flag(self,flag):
self.__flag = flag
#是否启用5G的私有函数
def __open_5G(self):
if self.__flag:
print("打开5G")
else:
print("关闭5G")
#在类中使用公共函数调用私有函数,供类的对象使用
def public_class(self):
self.__open_5G()
phone = Phone()
phone.set_flag(True)
phone.public_class()
继承
class Phone2021():
brand = '小米'
def function2021(self):
print(f'{self.brand}2021:打电话,发短信,拍照')
#单继承
class Phone2022(Phone2021):
playGame="打游戏"
def function2022(self):
print(f'{self.brand}2022:打电话,发短信,拍照,{self.playGame}')
p = Phone2022()
p.function2021()# 小米2021:打电话,发短信,拍照
#多继承,跟单继承一样,多写几个父类就行,例如Phone2022(Phone2021,Phone2020, Phone2019)
#重写父类成员变量和调用父类成员
class Phone2023(Phone2022):
#重写父类成员变量
brand = "华为"
#重写父类方法
def function2022(self):
print(f'{super().brand}2023:打电话,发短信,拍照,{Phone2022.playGame}')
p = Phone2023()
# 已经重写了父类
p.function2022()# 小米2023:打电话,发短信,拍照,打游戏
多态
#定义一个抽象父类
class Animal:
#定义一个抽象方法action
def action(self):
pass
#定义一个子类Dog,继承自Animal
class Dog(Animal):
#重写action方法
def action(self):
print("汪汪汪")
#定义一个子类Cat,继承自Animal
class Cat(Animal):
#重写action方法
def action(self):
print("喵喵喵")
#定义一个函数make_noise,接收一个Animal类型的参数
def make_noise(animal:Animal):
#调用animal的action方法
animal.action()
#创建一个Dog实例
dog = Dog()
#创建一个Cat实例
cat = Cat()
#调用make_noise函数,传入Dog实例
make_noise(dog)# 汪汪汪
#调用make_noise函数,传入Cat实例
make_noise(cat)# 喵喵喵