让python飞:形象理解python封装、继承、函数重写、类属性、对象属性、类函数、对象函数、序列化、反序列化、pickle

在这里插入图片描述
Day12大呲花参观姚明汽车厂
听闻姚明在美国办了个车厂,上海烟花厂的一箱炮竹不淡定了。他们决定要去向姚老板祝贺。所以,他们决定把自己封装在一个集装箱里走海运去美国。
到达美国后,姚明热情的接待了他们。有个叉车跑过来告诉姚老板,有个客户觉得车座太小,想换一个大的,结果换的那个太大,就放在车顶上去了,现在跑在街上巨丑无比。姚老板一听这哪行啊。我们送给客户的构造机也不能瞎用啊。这得设置一些条件,不能让他们随意设置东西
(在设计完类,外界创建对象通过.的形式访问(设置)属性,可能会出现跟现实情况不符的混乱数据,那么我们就将属性的设置权没收(外界不能直接通过.调用属性))大呲花说,这好办啊,在大铁架下方放一个大袋鼠,把客户的要求放进袋鼠的袋子里进行判断,让那些符合条件的配置要求通过,其他的不让通过

在类的内部提供外界额外的访问方式(定义setter和getter方法),并且在需要的时候,可以在函数的内部加入数据合法性的校验;对于setter函数,命名:set属性名(首字母大写)
设置值(__age): 
        def setAge(self,age): 
                self.__age = age

袋鼠还可以把纸条拿出来进行阅读

对于getter函数,命名:get属性名(首字母大写)        
获取值(__age): 
        def getAge(self): 
                return self.__age

姚明一听,对此表示赞同!
这时,一辆大象车呼啸而过,大呲花给吓坏了。姚明告诉他,这辆车就是从他的厂生产出来的车改造的。论辈分,他得叫我的车叫爸爸
(两部分组成,一部分我们称为父类(基类、超类、superclass),另一部分我们称为子类(派生类、subclass),子类可以使用父类中的成员(使用权))有的车只经过一次改造,成为单继承车。

class Teacher(Person): 
    def __init__(self,name,age,salary): 
        print('我是teacher类的构造函数。。。') 
        self.salary = salary 
        #调用父类构造函数   目的:父类的属性由父类自己赋值 
        #在子类构造函数中显示的调用其父类构造 
        # super(Teacher,self).__init__(name,age) 
        # super().__init__(name,age) 
        Person.__init__(self,name,age)

这样改造后的车既可以有父类的样式,也有自己的样式,既有父类的功能,也有自己的功能。
还有一种车经过多次改造,我们管这种车叫多重继承车,它是单继承车的延伸。还有一种车是吸取了多种风格改造出来的,我们把它叫多继承车

from father import Father 
from mother import Mother 
''' 
定义Child类同时继承Father和Mother类 
''' 
class Child(Father,Mother): 
    def __init__(self,money,faceValue,work): 
        self.work = work 
        Father.__init__(self,money) 
        Mother.__init__(self,faceValue)

改造的时候,有的客户对我们的车某些功能不太满意,想改进一下,这个我们也是支持的。但是我们的名字不能改

函数重写(override)前提:必须有继承性 
原因: 
        父类中的功能(函数),子类需要用,但是父类中函数的函数体内容和我现在要执行的逻辑还不相符 
        那么可以将函数名保留(功能还是此功能,但是将函数体重构; 
        注意: 子类重写父类的函数,除了函数体以外的部分,直接复制父类的即可)

大呲花问姚明这些改造车都是在哪加工的呢?姚明告诉大呲花,我们的厂里生产时给车设置一些基本属性,完了呢给它点功能

类函数: 
格式: 
@classmethod 
def 函数名(cls,...)cls可以理解为当前类的类名

它到客户手中,我们还给客户配置了一个铁架子,用来对车进行改造

(对象函数:格式: def 函数名(self,...) 
self可以理解为当前对象或者正在被创建的对象)

两者的关系是以客户改造为主

类可以调用类(属性、函数),不能调用对象(属性、函数),对象可以调用类(属性、函数),也能调用对象(属性、函数)。我们可以用别的方式解决,方式如下: 
        先进行对象实例化 --> d = cls(100) 
        d就可以随意的去访问对象属性和对象函数了)

大呲花开了辆车准备兜风,开完后,这辆车就被直接放到一个大的类似于水泥搅拌机的机器里,从下面出来就变成了一箱纸。这个机器叫pickle,它有两个口,上面有个进口叫dump(dump(obj, fr):将obj对象序列化到文件中(取决于fr中的path)),它能把车变成文字记录在纸上。下面的小口叫load(load(fw):将fw(path中的数据)加载到程序,以对象返回)它能把一箱纸重新变成车。

#实例化Person对象
# p = Person('貂蝉',18,'女',162.0,84,'靓丽')
#
# fw = open(r'person.txt','wb')

#对象序列化操作:将程序中的对象p序列化到person.txt文件中保存起来
# pickle.dump(p,fw)
#
# fw.close()

# fr = open(r'person.txt','rb')

#对象反序列化操作:将person.txt中的二进制数据反序列化到程序中,还原成为一个Person对象
# p1 = pickle.load(fr)
# print(p1,type(p1))
#
# fr.close())
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值