87590

类的组合-多态-封装等特性的简单学习

<p class="toc-title">目录

<ul><li>组合:</li> <li>多态:</li> <li>封装:</li> <li>1.统计对象的name属性被查看了多少次</li> <li>2 统计一下类被实例化了多少次</li> <li>3 通过property写一个计算圆形面积的类中有个area</li> <li>4 选课系统的管理员注册,登录功能写完</li> </ul> <h3 id="组合">组合:</h3> <h4 id="什么是组合">1.什么是组合?</h4>

​ 对象的某个属性是另一个类的对象

class Foo: def __init__(self,bar): self.bar = bar class Bar: pass bar = Bar() f = Foo(Bar()) f = Foo(bar) <h4 id="为什么使用组合">2.为什么使用组合</h4>

​ 可以减少代码的冗余,如我们有两个类分别是学生类,教师类,我们需要学生添加一个选课信息的一个属性,课程信息包括课程名,课程价格,课程周期.这样我们每次添加选课信息都要输入这些信息.所以我们把它定义成一个类.

class Student: def __init__(self,name,age,course): self.name = name self.age = age self.course = course class Teacher: def __init__(self,name,age,level,course): self.name=name self.age=age self.level=level self.course=course class Course: def __init__(self,cname,cprice,cperiod) self.cname = cname self.cprice = cprice self.cperiod = cperiod course = Course('python',19800,7) stu = Student('tom',18,course) tea = Teacher('mary',30,course) <h3 id="多态">多态:</h3> <h4 id="什么是多态">1.什么是多态?</h4>

​ 它表示的是一类事物的多种形态,如水在不同的温度下有不同的状态.

<h4 id="什么是多态性">2.什么是多态性?</h4>

​ 多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

import abc class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物 @abc.abstractmethod # 上述代码子类是约定俗称的实现这个方法,加上@abc.abstractmethod装饰器后严格控制子类必须实现这个方法 def talk(self): raise AttributeError('子类必须实现这个方法') class People(Animal): # 动物的形态之一:人 def talk(self): print('say hello') class Dog(Animal): # 动物的形态之二:狗 def talk(self): print('say wangwang') class Pig(Animal): # 动物的形态之三:猪 def talk(self): print('say aoao') peo2 = People() pig2 = Pig() d2 = Dog() d2.talk() pig2.talk() <h4 id="多态性有哪些好处">3.多态性有哪些好处?</h4>

​ 1.增加了程序的灵活性

​ 2.增加了程序的可扩展性

<h3 id="封装">封装:</h3> <h4 id="什么是封装">1.什么是封装?</h4>

​ 封装的是指我们类的属性以及方法,放在一起就是封装

<h4 id="为什么要封装">2.为什么要封装?</h4>

​ 封装数据的主要原因是:保护隐私

​ 封装方法的主要原因是:隔离复杂度

<h4 id="封装的两个层面">3.封装的两个层面</h4>

​ 1.创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj的方式去访问里面的名字,这本身就是一种封装.

​ 2.类中把某些属性和方法隐藏起来(或者说变成私有的),只在类的内部使用,外部无法访问,或者留下少量接口(函数)供外部访问.

#在python中用双下划线的方式实现隐藏属性(设置成私有的) #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __n = 0 def __init__(self): self.__x = 10 def __foo(self): print('from A') def bar(self): self.__foo() <h3 id="统计对象的name属性被查看了多少次">1.统计对象的name属性被查看了多少次</h3> class Student: def __init__(self,name,age): self.__name = name self.age = age self.count = 0 def getName(self): self.count += 1 return self.__name stu = Student('tony',18) stu.getName() print(stu.count) <h3 id="统计一下类被实例化了多少次">2 统计一下类被实例化了多少次</h3> class Student: count = 0 def __init__(self,name,age): self.__name = name self.age = age Student.count+=1 stu = Student('tony',18) stu2 = Student('tony',18) stu3 = Student('tony',18) print(Student.count) <h3 id="通过property写一个计算圆形面积的类中有个area">3 通过property写一个计算圆形面积的类中有个area</h3> class circle: def __init__(self,r): self.__r = r @property def area(self): return 3.14*self.__r**2 c = circle(1) print(c.area) <h3 id="选课系统的管理员注册登录功能写完">4 选课系统的管理员注册,登录功能写完</h3> import os import pickle dic_msg = """ 1-管理员注册 2-管理员登陆 """ admin = {'username':None} def admin_register(): username = input('请输入用户名:') password = input('请输入密码:') filepath = os.path.join(os.path.dirname(os.path.dirname(__file__)),'admin') file = os.path.join(filepath,f'{username}.pkl') if os.path.exists(file): print('用户名已存在!') else: user = {'username':username,'password':password} with open(file,'wb') as fw: pickle.dump(user,fw) print('注册成功!') def admin_login(): username = input('请输入用户名:') password = input('请输入密码:') filepath = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'admin') file = os.path.join(filepath, f'{username}.pkl') if not os.path.exists(file): print('用户名不存在!') else: with open(file,'rb') as fr: user = pickle.load(fr) if user['password'] == password: admin['username'] = username print('登录成功!') else: print('密码错误!') dic_func = { '1':admin_register, '2':admin_login } def run(): while True: print(dic_msg) choice = input('请输入你要选择的功能编号:(q退出)') if choice == 'q': break if choice not in dic_func: print('你的输入有误1') continue dic_func[choice]() if __name__ == '__main__': run()

来源:博客园

作者:cheng825

链接:https://www.cnblogs.com/cheng825/p/11425991.html

Recommend