Python自动化之pickle和面向对象初级篇
pickle模块扩展
1 pickle之文件操作
示例1
with open("test", 'rb') as f:
lines = f.readlines()
print(pickle.load(f))
运行报错:
print(pickle.load(f))
EOFError: Ran out of input
with open("test", 'rb') as f:
print(pickle.load(f))
运行正常
[1, 2, 3]
pickle.load的时候只能有load不能有别的
示例2
正常读
f1 = open("test1", "r")
f1.readline()
运行正常
读取的文件为空
pickle读文件
f1 = open("test1", "rb")
print(pickle.load(f1))
运行报错
EOFError: Ran out of input
pick不能load空文件
2 面向对象
特性:
-
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法 -
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承 -
Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
经典类和新式类
Python2中class 类名(Object)为新式类,class 类名为经典类
Python3中都是新式类。
区别
新式类是广度优先,而经典类是深度优先
3 面向对象基础知识
如何定义一个类
clss People(object):
pass
People为类名,首字母大写。
类的属性
class People(object):
def __init__(self, name, age):
self.name = name
self.__age = age
self为实例本身,self.name = name是类的一个属性,self.__age =age的age前面有两个下划线为私有属性。
私有属性是不能够在类外通过对象名来进行访问的。
如果要访问需要_类名__name这样来进行访问,也可以称为伪私有属性。
类的方法
定义方法采用def关键字,一般以名为'self'的变量作为该参数(用其他名称也可以),而且需要作为第一个参数
class People(object):
def __init__(self, name, age):
self.name = name
self.__age = age
def mouseget(self):
print("hahaha")
mouseget为方法的名称,定义方法的关键字def。
类的内置方法
构造方法__init__(self,....)在生成对象时调用,可以用来进行一些初始化操作,不需要显示去调用,系统会默认去执行。构造方法支持重载,如果用户自己没有重新定义构造方法,系统就自动执行默认的构造方法。
析构方法__del__(self)在释放对象时调用,支持重载,可以在里面进行一些释放资源的操作,不需要显示调用。
4 继承
示例1 全部继承于父类
class People(object):
def __init__(self, name, age):
self.name = name
self.__age = age
def __mouseget(self):
print("hahaha")
class Dpope(People):
def nishi(self):
print(self.name, self._People__age)
Dpope("名字","年龄").nishi()
运行结果: 名字 年龄
People是Dpope的父类,因为Dodple没有name和age变量,所以会去父类里面寻找,因为找到了,所以会输出。
示例2 继承并有自己的属性
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __mouseget(self):
print("hahaha")
class Dpope(People):
def __init__(self, name, age, sex):
super(Dpope, self).__init__(name, age)
self.sex = sex
def nishi(self):
print(self.name, self.age, self.sex)
Dpope("名字","年龄", "性别").nishi()
要想有自己的属性并还想继承父类,可以用super继承的方法。
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __mouseget(self):
print("hahaha")
class Cop(People):
pass
class Dpope(People, Cop):
def __init__(self, name, age, sex):
super(Dpope, self).__init__(name, age)
self.sex = sex
def nishi(self):
print(self.name, self.age, self.sex)
Dpope("名字","年龄", "性别").nishi()
多继承从左到右依次寻找父类
5 多态
“多态”,英文是:Polymorphism,在台湾被称作“多型”。维基百科中对此有详细解释说明。
多型(英语:Polymorphism),是指物件导向程式执行时,相同的讯息可能会送給多个不同的类別之物件,而系统可依剧物件所属类別,引发对应类別的方法,而有不同的行为。简单来说,所谓多型意指相同的讯息給予不同的物件会引发不同的动作称之。
再简化的说法就是“有多种形式”,就算不知道变量(参数)所引用的对象类型,也一样能进行操作,来者不拒。
例如著名的 repr() 函数,它能够针对输入的任何对象返回一个字符串。这就是多态的代表之一。
def length(x):
... print "The length of", repr(x), "is", len(x)
class Animal:
def __init__(self, name=""):
self.name = name
def talk(self):
pass
class Cat(Animal):
def talk(self):
print "Meow!"
class Dog(Animal):
def talk(self):
print "Woof!"
a = Animal()
a.talk()
c = Cat("Missy")
c.talk()
d = Dog("Rocky")
d.talk()
运行结果
$ python 21101.py
Meow!
Woof!