面向对象
1.面向过程开发,程序的实现逻辑是我们一步一步参与实现的
2.面向对象开发,是基于面向过程得来的思想,在程序中不断创建对象,指挥对象做事情
面向对象的三大特征:
封装
继承
多态
抽象
世界万物皆可对象
任意一个事物,都可以从两个方面去描述,属性,行为
面向对象开发
语法格式
#面向对象的思想,创建一个类。然后根据这个类创建若干个对象
#定义类
class 类名:
#行为函数
def xxx():
pass
...
#根据类创建对象
p = 类名()
p.xxx()
创建两个对象的情况
class MessageInfo:
def send_email(self, name):
print(f'发送邮件给{name}')
def send_phone_message(self,name):
print(f'发送手机短信给{name}')
#创建一个对象
m1 = MessageInfo()
m1.send_email('a')
m1.send_phone_message('a')
#创建第二个对象
m2= MessageInfo()
m2.send_email('a')
m2.send_phone_message('a')
面向对象开发的三大特征
- 封装: 将数据封装在对象中
- 继承: 子类继承父类
- 多态:某种事物在不同状态下的体现。对python而言,默认支持多态,因为python是动态数据类型。
封装
lass Student:
def __init__(self, name, age):
self.__name = name
# 在成员变量前面加__表示将该成员变量变成私有的了,这个变量只能在当前类中可以访问
self.__age = age
def __str__(self):
return f'姓名:{self.name}, 年龄:{self.__age}'
def set_age(self, age):
self.__age = age
def get_age(self):
return self.__age
def set_name(self, name):
self.__name = name
def get_name(self):
return self.__nameclass Student:
def __init__(self, name, age):
self.name = name
# 在成员变量前面加__表示将该成员变量变成私有的了,这个变量只能在当前类中可以访问
self.__age = age
def __str__(self):
return f'姓名:{self.name}, 年龄:{self.__age}'
def set_age(self, age):
if age > 150 or age < 0:
print('年龄不合法,默认改为18')
self.__age = 18
else:
self.__age = age
# 创建一个学生对象
s1 = Student('张三', 18)
print(s1)
# s1.__age = 1000
# print(s1)
# print(s1.__age)
s1.set_age(20)
print(s1)
__init__()函数 构造一个对象的作用
__str__()函数 返回成员变量的情况
将成员变量私有化,在变量的前面加__
提供成员变量对应的set_xxx()函数 以及 get_xxx()函数
继承
lass Student:
def __init__(self, name, age):
self.__name = name
# 在成员变量前面加__表示将该成员变量变成私有的了,这个变量只能在当前类中可以访问
self.__age = age
def __str__(self):
return f'姓名:{self.name}, 年龄:{self.__age}'
def set_age(self, age):
self.__age = age
def get_age(self):
return self.__age
def set_name(self, name):
self.__name = name
def get_name(self):
return self.__name
- 父类无法使用子类中的功能
- 子类要想使用父类中的东西,通过super()的方法
- super(), 一般是用作在子类中函数内部,访问父类中的类成员变量
普通员工:工号 姓名 化名 职位 薪资
class Staff:
def __init__(self, sid, name, new_name, job, salary):
self.sid = sid
self.name = name
self.new_name = new_name
self.job = job
self.salary = salary
def __str__(self):
return f'工号:{self.sid}, 姓名:{self.name}, 化名:{self.new_name}, 职位:{self.job}, 薪资:{self.salary}'
def work(self):
print('工作')
# 组长: 工号 姓名 化名 职位 薪资 奖金
class Leader(Staff):
def __init__(self, sid, name, new_name, job, salary, common):
super().__init__(sid, name, new_name, job, salary)
self.common = common
def __str__(self):
return f'工号:{self.sid}, 姓名:{self.name}, 化名:{self.new_name}, 职位:{self.job}, 薪资:{self.salary}, 奖金:{self.common}'
# 创建一个普通员工对象
s1 = Staff('sj1001', '张三', '张三丰', '大数据开发工程师', 8500)
print(s1)
# 创建一个组长对象
s2 = Leader('sj1002', '李四', '韩立', '高级大数据开发工程师', 18000, 20000)
print(s2)
多态
#python默认支持多态
class Animal:
pass
class Tiger(Animal):
pass
class Lion(Animal):
pass
s1 = Tiger()
s2 = Lion()
Animal a1 = new Tiger();
抽象
# 定义一个动物类
class Animal:
@abstractmethod
def eat(self):
pass
class Dog(Animal):
@override
def eat(self):
print('狗吃肉')
class Cat(Animal):
@override
def eat(self):
print('猫吃鱼')
d1 = Dog()
d1.eat()
c1 = Cat()
c1.eat()
类变量
#类变量在创建对象的时候复制一份到子类对象中
class Demo:
a1 = 100
def fun1(self):
print('hello world')
d1 = Demo()
print(Demo.a1) #100
d2 = Demo()
print(Demo.a1) #100
print('--------------')
d1.a1 = 200
print(Demo.a1) #100
print(d1.a1) #200