封装与组合

继承json模块并派生新的功

继承json 模块中JSONEncoder,并派生出新的功能

本身json只能转化七大数据类型,如果转化对象是对象,将报错

default方法就是出现不能转化的就会报错,继承原父类功能,想更改其中一个函数

命名相同,添加if筛选,并且最终返回相应函数

import datetime,json


class MyJson(json.JSONEncoder):
    def default(self, o):
        if isinstance(o,datetime.datetime):
            return datetime.datetime.strftime(o,'%Y-%m-%d %X')
        else:
            return super().default(self,o)#其他数据类型直接返回原函数
dict1= {'time':datetime.datetime.now()}

res = json.dumps(dict1)
print(res)
print(type(res))

组合

组合:一个对象中包含另一个或多个对象,从而减少代码冗余

继承:继承是类与类的关系,子类继承父类属性与方法,子类与父类使用中从属关系

组合:组合是对象与对象的关系,一个对象拥有另一个对象的属性或方法,什么有什么的关系

class People:
    def __init__(self,name,age,sex):
        self.name= name
        self.age = age
        self.sex = sex

class Teacher(People):
    def __init__(self,name,age,sex):
        super().__init__(name,age,sex)


class  Student(People):
    def __init__(self,name,age,sex):
        super().__init__(name,age,sex)

class Date:
    def __init__(self,year,mouth,day):
        self.year = year
        self.mouth =mouth
        self.day = day
    def tell_birth(self):
        print(f"""
        出生年月日
        年:{self.year}
        月:{self.mouth}
        日:{self.day}
        """)

stu1 = Student('TYS',18,'MAN')
date_obj = Date(1993,5,31)
stu1.date_obj = date_obj
stu1.date_obj.tell_birth()

组合练习

练习需求:

选课系统:

1.有学生、老师类,学生与老师有属性 “名字、年龄、性别、课程”,

2.有方法 老师与学生可以添加课程, 打印学习/教授课程。

#创建父类,包含共有的特性姓名,年龄,性别,课程(添加课功能,打印课程表)
class People:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex
    def add_course(self,course_obj):
        self.course_list.append(course_obj)
    def tell_all_course_info(self):
        for course_obj in self.course_list:
            course_obj.tell_course_info()
#建立学生类
class Student(People) :
    def __init__(self,name,age,sex):
        super().__init__(name,age,sex)
        self.course_list=[]
#建立老师类
class Teacher(People) :
    def __init__(self,name,age,sex):
        super().__init__(name,age,sex)
        self.course_list=[]
#建立课程类包含,课程表的属性,打印课程标的功能
class Course:
    def __init__(self,course_name,course_price,course_time):
        self.course_name = course_name
        self.course_price = course_price
        self.course_time = course_time
    def tell_course_info(self):
        print(f"""
        ======课程信息如下======
        课程名称:{self.course_name}
        课程价格:{self.course_price}
        课程周期:{self.course_time}
        """)

#创建学生对象
stu1 = Student('TIAN',18,'MAN')

#创建课程对象
python_obj = Course('Python',111,6)

#学生对象添加课程对象
stu1.add_course(python_obj)

stu1.tell_all_course_info()

封装

封装:把属性和功能封装在对象中

对象好比一个袋子,可以存放一堆属性和方法

存不是目的,目的是为了取,可以通多 对象. 的方式获取属性或方法

封装的目的:可以通过 对象. 的方法存放、获取属性或方法方便数据的存取

如何封装,类实例化,往对象传参

访问限制机制

访问限制机制:在类内部定义的变量名,函数名前边带有__ 的会被限制外部不能直接访问该属性原型,

其实是改变成: _类名__属性|方法

将一些隐私的数据隐藏起来,不让外部轻易获取、

可以将一堆数据封装成一个接口,可以让用户调用接口,并且通过相应的逻辑,最后再将数据返回给用户

class ATM:
    def __insert_card(self):
        print('开始插卡')
    def __input_pwd(self):
        print('输入密码')
    def __input__bal(self):
        print('输入金额')
    def __output_money(self):
        print('开始出钞')
    def __print_flow(self):
        print('打印流水')

    def withdraw(self):
        self.__insert_card()
        self.__input_pwd()
        self.__input__bal()
        self.__output_money()
        self.__print_flow()
obj = ATM()

obj.withdraw()

property

property:是一个装饰器,可以装饰在类内部的方法上,使其调用时无需加( )
在某些情况下调用的方法只是为了或取方法计算后的值,去掉( )后
让方法看起来像调用属性
原文地址:https://www.cnblogs.com/fxsm/p/11945015.html