Python的面向对象
面向对象的三大特性继承、封装、多态。
● 继承:子类可以继承父类的方法(类比儿子继承父亲的财产)
● 封装:只用调取相关的方法,没必要明白具体的实现过程(类比Pyhton中各种内置方法的使用)或者对于公共数据封装在内部,不在外部被修改
● 多态:主要是在继承之后对父类方法的重载。使得同一个方法名表现出不同的形态,也即实现不同的功能
1、面向对象的基础案例
from time import sleep
class Clock:
def __init__(self, hour=0, minute=0, second=0):
self.hour = hour
self.minute = minute
self.second = second
def run(self):
'''表盘走字'''
self.second += 1
if self.second == 60:
self.minute += 1
self.second = 0
if self.minute == 60:
self.hour += 1
self.minute = 0
if self.hour == 24:
self.hour = 0
def show(self):
'''显示时间'''
print("%02d时%02d分%02d秒" % (self.hour, self.minute, self.second))
def main():
clock = Clock(23, 47, 59)
while True:
print(clock.show())
sleep(3)
clock.run()
if __name__ == "__main__":
main()
2、面向对象中受保护的变量和可被修改的变量
1⃣️property修饰之后该方法就具有属性的特点,可以使用属性的调用方式,即在调用时不需要和方法一样,加上括号。
2⃣️变量.setter 和 变量.getter 分别代表对属性的读写操作。setter可对该属性修改;getter可对该属性读取
示例1:
class Pearson:
'''抽象基类'''
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self): # 受保护的变量
return self._name
@property
def age(self):
return self._age
@age.setter
def age(self, age): # 将方法变为属性,可以用调用属性的方法调用
self._age = age
def play(self):
print("%s正在玩LOl" % self._name)
def watch(self):
if self.age < 18:
print("抱歉!%s,您只有%s岁,只能观看。。。" % (self._name, self._age))
else:
print("您好!%s,您已经%s岁了,可以观看的范围更广!" % (self._name, self._age))
class Student(Pearson):
def __init__(self, name, age, grader):
super(Student, self).__init__(name, age)
self._grader = grader
@property
def grader(self):
return self._grader
@grader.setter
def grader(self, grader):
self._grader = grader
def study(self, course):
print("%s正在学习%s" % (self._name, course))
class Teacher(Pearson):
def __init__(self, name, age, teach_age):
super(Teacher, self).__init__(name, age)
self._teach_age = teach_age
@property
def teach_age(self):
return self._teach_age
@teach_age.setter
def teach_age(self, teach_age):
self.teach_age = teach_age
def cal_teachage(self):
'''计算教龄'''
print("%s已经有%s年的教龄!" % (self._name, self._teach_age))
def main():
stu = Student("Ann", 23, "Woman")
stu.study("Chinese")
stu.watch()
tea = Teacher("DongDong", 47, 12)
tea.cal_teachage()
if __name__ == "__main__":
main()
示例2
class showPage:
def __init__(self, current_page):
self.current_age = current_page # 当前页码
self.per_iterm = 10 # 每页显示10条数据
@property
def start(self):
'''下次读取数据的起始位置'''
page_start = (self.current_age - 1) * self.per_iterm
return page_start
@property
def end(self):
'''读取数据的结束位置'''
page_end = self.current_age * self.per_iterm
return page_end
page = showPage(12)
print(page.start) # 加了property可直接调用,不需要像调用方法一样加上括号
print(page.end)