第二十四天
组合内容回顾
一个类的对象是另一个类对象的属性
两个类之间 有什么什么的关系 :班级有学生 学生有班级 班级有课程 图书有作者 学生有成绩)
学生 课程
班级 课程
圆形 圆环
圆形 圆锥 圆柱
当你改的多的时候, 运用分组比较方便
命名空间
 在类的命名空间里 :静态变量, 绑定方法
 在对象命名空间里:类指针,对象的属性(实例属性)
调用习惯
类名:静态变量
对象: 静态变量(对象调用静态变量时候,不能对变量赋值操作, 只能查看 不能 向后面的一样 对象.静态变量'=')
绑定方法
对象.绑定方法() 类名.绑定方法(对象)
三大特性
继承
封装
多态
进阶
# 猫
#     吃
#     喝
#     睡
#     爬树
# 狗
#
#     吃
#     喝
#     睡
#     看家
#
# 继承 --需要解决代码重复的
# 继承语法
#
# class A:
#     pass
# class B:
#     pass
#
# B继承A  A是父类 B是子类
# A是父类 基类  超类
# B是 子类   派生类
继承
B继承A  A是父类 B是子类
A是父类 基类  超类
B是 子类   派生类
子类可以用
父类和子类的方法选择:
 子类的对象 如果去调用方法
 永远优先调用自己的
 如果自己有 用自己的
 自己没有 用父类的
 如果自己有 还想用父类的 直接在子类方法中 调父类 的方法 ,
 父类名.方法名
class Animal:
    def __init__(self,name,food):
    # def __init__(self,name):
        self.name=name
        self.food=food
        self.blood=100
        self.waise=100
    def eat(self):
        # print(f'{self.name} is eating')
        print(f'{self.name} is eating {self.food}')
    def drink(self):
        print(f'{self.name} is drinking')
    def sleep(self):
        print(f'{self.name} is sleep')
class Cat(Animal):
    def clime_tree(self):
        print(f'{self.name} is climbing')
    def eat(self):
        self.blood+=100
        Animal.eat(self)
class Dog(Animal):
    def eat(self):
        self.waise+=100
        Animal.eat(self)
    def house_keep(self):
        print(f'{self.name} is keeping')
小白=Cat('小白','猫粮')
小黑=Dog("小黑",'狗粮')
小白.eat()
小黑.eat()
print(小白.__dict__)
print(小黑.__dict__)
# 
# 小白 is eating 猫粮
# 小黑 is eating 狗粮
# {'name': '小白', 'food': '猫粮', 'blood': 200, 'waise': 100}
# {'name': '小黑', 'food': '狗粮', 'blood': 100, 'waise': 200}
特殊属性
# 小猫 小狗有特殊的属性
class Animal:
    def __init__(self,name,food):
    # def __init__(self,name):
        self.name=name
        self.food=food
        self.blood=100
        self.waise=100
    def eat(self):
        # print(f'{self.name} is eating')
        print(f'{self.name} is eating {self.food}')
    def drink(self):
        print(f'{self.name} is drinking')
    def sleep(self):
        print(f'{self.name} is sleep')
class Cat(Animal):
    def __init__(self,name,food,eyes):
        Animal.__init__(self,name,food) #调用弗雷德方法三 ,去完成一些通用属性的初始化  
        self.eyes=eyes  #派生属性
    def clime_tree(self):
        print(f'{self.name} is climbing')
    def eat(self):
        self.blood+=100
        Animal.eat(self)
class Dog(Animal):
    def eat(self):
        self.waise+=100
        Animal.eat(self)
    def house_keep(self):
        print(f'{self.name} is keeping')
小白=Cat('小白','猫粮','蓝色')
小黑=Cat('小白','猫粮','三只眼睛')
print(小黑.__dict__)
print(小白.__dict__)
# {'name': '小白', 'food': '猫粮', 'blood': 100, 'waise': 100, 'eyes': '三只眼睛'}
# {'name': '小白', 
单继承
# 单继承  不管有几个儿子  都是单继承
class D:
    def func(self):
        print("in D")
class A(D):pass
class B(A):
    def func(self):
        print('in B')
class C(B):pass
C().func()
# in B
class D:
    def func(self):
        print("in D")
class A(D):pass
class B(A):pass
class C(B):pass
C().func()
# in D
多继承
# # 多继承 有好几个爹
#
# 有些语言不支持多继承 java
# python语言特点 可以在面向对象中支持多继承\
class B:
    def funv(self):print('IN B ')
class A:
    def funv(self):print('IN A ')
class C(A,B):  #  谁在前 就执行谁   A 在前
    pass
C().funv()
# IN A
class C(B,A):   #  谁在前 就执行谁  B在前
    pass
C().funv()
# IN B
#
base
# bases 只显示第一个父类
class A :pass
print(A.__bases__)
# (<class 'object'>,)
class C :pass
class B(A,C) :pass
print(B.__bases__)
#
# (<class '__main__.A'>, <class '__main__.C'>)
类的补充
二:特殊的类属性
类名.__name__# 类的名字(字符串)    
类名.__doc__# 类的文档字符串   查看当前 函数的注释  也可以查看 类的注释
主要用来 卖萌
def a():
    '''sahjkodaskljdhkasjdhjkas'''
    pass
print(a.__doc__)
sahjkodaskljdhkasjdhjkas
#
class A:
    '''这个类是猫咪哦'''
    pass
print(A.__doc__)
#这个类是猫咪哦
类名.__base__# 类的第一个父类(在讲继承时会讲)
类名.__bases__# 类所有父类构成的元组(在讲继承时会讲)
类名.__dict__# 类的字典属性    变量名字  函数名字 全在里面
类名.__module__# 类定义所在的模块   脚本中 __main__   文件中   打印文件的名字
类名.__class__# 实例对应的类(仅新式类中)  查看类的类型   type   都是方法
补充
# 所有在python3中的类都是继承  object类
#
# object 中有 init
# 所有类都默认继承object
class A :
    pass    #即便什么都不写  也不会报错
# 等于
# class A (object):  #  规范写法
#     pass
a=A()
a=A()
# 开空间,调用init
# bases 只显示父类  不显示更上一级的类
class A :pass
print(A.__bases__)
# (<class 'object'>,)
class C :pass
class B(A,C) :pass
print(B.__bases__)
#
# (<class '__main__.A'>, <class '__main__.C'>)
绑定方法和普通的函数
from types import Functiontype,Methodtype
#Functiontype  函数
#Methodtype  方法
#isinstance type
a=1
b='asd'
print(isinstance(a,int))
print(type(a) is int)
class Cat:
    pass
小白=Cat()
print(type(小白))
print(isinstance(小白,int))
print(type(小白) is Cat)  #判断小白是不是Cat类
#isinstance 和   type  的比较
class Animal:
    pasa
class Cat(Animal):
    pass
小白=class(Cat)
print(type(小白) is Cat)
print(type(小白) is Animal)
True
False
print(isinstance(小白,Cat))
print(isinstance(小白,Animal))
True
True
结论:
isinstance可以判断 继承类的关系
type 只能判断父类  不能判断父类的父类  
#Functiontype  函数
#Methodtype  方法
class A :
    def (self):
        print('in func')
print(A.func)   #函数    	类名调用 始终是一个函数
a=A()
print(a.func)  #方法      对象去调用   它是一个方法
print(isinstance(a.func,Functiontype))  
print(isinstance(a.func,Methodtype))  #对
print(isinstance(A.func,Functiontype))  #对
print(isinstance(A.func,Methodtype))
pickle
pickle 是一个 python 中, 压缩/保存/提取 文件的模块,字典和列表都是能被保存的.
但必须注意的是python2以ASCII形式保存,而在python3中pickle是使用转换二进制的数据压缩方法保存数据
所以,在保存或者读取数据的时候,打开文件应该使用‘wb' 'rb'的方式
import pickle
a = 'owoof'
with open('111.pkl', 'wb') as file:
    pickle.dump(a, file)
在Pickle模块中还有dumps()和loads()函数,他们是直接实现一个二进制和pickle表示对象的转换,不用打开文件(这点与dump不同)
dumps()是将可读对象转换成二进制文件,并返回二进制文件,loads()是把二进制文件转换成可读对象,并返回对象
在使用dump()和load()时,需要注意用with open 打开一次文件每调用一次dump()就会在文件中生成一次数据, 当再次with open 打开文件时, 之前写数据调用了几次dump()就最多只能调用load()几次,而且每次dump()是和load()对应的.
dump()次数和load()次数 是对应的
with open('poins_normal.pkl', 'rb') as file:with open('poins_normal.pkl', 'rb') as file:
  class_1 = pickle.load(file)
  # print(np.shape(class_1))
  class_2 = pickle.load(file)
  labels = pickle.load(file)
  class_1 = pickle.load(file)
  # print(np.shape(class_1))
  class_2 = pickle.load(file)
  labels = pickle.load(file)
如上,我事先写了三次dump(),那么之后的三次load()是一一对应的,如果我进行第四次load()调用,编译器会提示data ran out of .
class Course:
    def __init__(self,name,period,price):
        self.name=name
        self.period=period
        self.price=price
python=Course('python','6month','21800')
linux = Course('linux','5 moneth',19800)
go = Course('go','4 moneth',12800)
#
# #
# import pickle
# with open('pickle_f','wb') as f:
#     pickle.dump(python,f)
#     pickle.dump(linux,f)
#     pickle.dump(go,f)
# with open('pickle_file','rb') as f:
#     ret=pickle.load(f)
    # print(ret)
    # < __main__.Course
    # object
    # at
    # 0x02AEAA50 >
    # print(ret.__dict__)
    # # {'name': 'python', 'period': '6month', 'price': '21800'}
# from core import login
import time
import pickle
#
with open('pickle_f','rb') as f:
    while 1:
        try:
            obj=pickle.load(f)
            print(obj.name,obj.price)
            time.sleep(1)
        except EOFError:
            break
封装
多态
进阶
2020年3月12日15:22:25 修改
                    
                
                
            
        
浙公网安备 33010602011771号