面向对象三特性
- 封装
- 继承
- 多态
封装
保护私隐,明确区分内外。隐藏数据,并对外提供操作该数据的接口,完成对数据属性操作的严格控制。
class Student:
def __init__(self, name, birthdate):
self.name = name
self.birthdate = birthdate
# 属性 s.age 装饰的对象函数是一个getter函数
@property
def age(self):
return datetime.date.today().year - self.birthdate.year
# 只定义getter方法,不定义setter方法就是一个只读属性
@age.setter
def age(self, value):
raise AttributeError('禁止赋值年龄')
# @deleter定义可读可写可删除属性
@age.deleter
def age(self):
raise AttributeError('年龄不能删除')
if __name__ == '__main__':
s = Student('tom', datetime.date(1992,3,1))
print(s.birthdate)
print(s.age)
继承
Employee是基类,Programer和HR是继承了基类的类
import datetime
# 继承
class Employee:
def __init__(self, department, name, birthdate, salary):
self.department = department
self.name = name
self.birthdate = birthdate
self.salary = salary
def __repr__(self):
return '<员工: {}>'.format(self.name)
def give_raise(self, percent, bonus=0.1):
self.salary = self.salary*(1+percent+bonus)
def working(self):
print('员工: {} 在工作'.format(self.name))
@property
def age(self):
return datetime.date.today().year - self.birthdate.year
class Programer(Employee):
def __init__(self, department, name, birthdate, salary, specialty, project):
super().__init__(department, name, birthdate, salary)
self.specialty = specialty
self.project = project
def working(self):
print('程序员{}在工作, 开发{}'.format(self.name, self.project))
class HR(Employee):
def __init__(self,department, name, birthdate, salary,qualification_level=1):
Employee.__init__(self, department, name, birthdate, salary)
self.qualification_level = qualification_level
def working(self):
print('人事: {} 正在面试'.format(self.name))
if __name__ == '__main__':
p = Programer('技术部','peter',datetime.date(1990,3,3,),8000,'Flask', 'crm')
print(p)
print(p.age)
hr = HR('人事部', 'marry', datetime.date(1990,2,3,), 9000, 1)
多态
属于同一类型的不同实例,对同一信息不同的响应。
这里HR,Programer对Department有不同响应。
# 多态
import datetime
class Department:
def __init__(self, department, phone, manger):
self.department = department
self.phone = phone
self.manger = manger
def __repr__(self):
return '<部门: {}>'.format(self.department)
# 继承
class Employee:
def __init__(self, department, name, birthdate, salary):
self.department = department
self.name = name
self.birthdate = birthdate
self.salary = salary
def __repr__(self):
return '<员工: {}>'.format(self.name)
def give_raise(self, percent, bonus=0.1):
self.salary = self.salary*(1+percent+bonus)
def working(self):
print('员工: {} 在工作'.format(self.name))
@property
def age(self):
return datetime.date.today().year - self.birthdate.year
class Programer(Employee):
def __init__(self, department, name, birthdate, salary, specialty, project):
super().__init__(department, name, birthdate, salary)
self.specialty = specialty
self.project = project
def working(self):
print('程序员{}在工作, 开发{}'.format(self.name, self.project))
class HR(Employee):
def __init__(self,department, name, birthdate, salary,qualification_level=1):
Employee.__init__(self, department, name, birthdate, salary)
self.qualification_level = qualification_level
def working(self):
print('人事: {} 正在面试'.format(self.name))
if __name__ == '__main__':
dep = Department('技术部, ''8080133','张大三')
p = Programer(Department,'peter',datetime.date(1990,3,3,),8000,'Flask', 'crm')
hr = HR('人事部', 'marry', datetime.date(1990,2,3,), 9000, 1)