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

组合:

1.什么是组合?

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

class Foo:
	def __init__(self,bar):
        self.bar = bar 
class Bar:
    pass

bar = Bar()
f = Foo(Bar())
f = Foo(bar)

2.为什么使用组合

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

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)
        

多态:

1.什么是多态?

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

2.什么是多态性?

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

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()

3.多态性有哪些好处?

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

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

封装:

1.什么是封装?

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

2.为什么要封装?

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

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

3.封装的两个层面

​ 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()

1.统计对象的name属性被查看了多少次

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)

2 统计一下类被实例化了多少次

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)

3 通过property写一个计算圆形面积的类中有个area

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)

4 选课系统的管理员注册,登录功能写完

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()

原文地址:https://www.cnblogs.com/cheng825/p/11425991.html