类class
类是对一类事物的抽象。比如汽车,门,猫。
Python中, 类(class)的变量是所有对象共享使用, 只有一个拷贝, 所有对象修改, 都可以被其他对象所见;
对象(object)的变量由类的每个对象所拥有,每个对象都包含自己的一份拷贝, 不会影响其他对象;
之前学习的都是Python自带的数据类型,class则是我们自己定义的类型。
对象object
某类事物中的一个具体的实例,对应类。如果我家的那辆汽车,张伟办公室的大门,隔壁丽丽家的那只小花猫。
类与对象的关系
类就像是对象的模板,可以批量生产出许多的对象。
好比下面a这个变量其实是整形数字int类的一个实例,那int这个类还可以’复刻’出许许多多的整形对象。这些对象共有的特征就是:整数性。
__init__函数
类中的构造函数,用以在初始化对象时使用。
self,cls关键字
self是指向每个独立对象的指针.在实例方法中第一个形参被命名为 self,以区别其它函数。
cls是指向类的指针,在类方法中第一个形参要命名为cls.
类内部的不同类型方法
实例方法:
是指该类的每个实例都可以调用到的方法。只有实例能调用实例方法。定义时第一个形参为self
类方法:
类方法是将类本身作为对象进行操作的方法。类对象和实例都可以调用类方法。定义时以@classmethod进行装饰,其第一个参数是类,约定写为cls。
实例方法和类方法都是依赖于python的修饰器来实现。 对象方法以self参数,类方法以cls参数来传递。
静态方法:
可以认为静态方法是一种存在在类中普通函数,不会对任何实例类型进行操作,类对象和实例都可以调用静态方法,定义时以@staticmethod进行声明。
类变量和实例变量
类变量定义在类的内部,像普通变量一样定义即可。用 类名.变量名 直接去访问。实例也能访问类变量
实例变量则是以self.开头,仅供各个实例对象
封装
封装就是将抽象的数据(变量)和行为(函数)打包,形成一个逻辑上的整体(即类);
封装可以增强安全性(数据)并简化编程(函数),用户只能通过类对外接口的访问权限来使用类的成员。
继承
一个类可以以 class newclsname():来开始全新构造(实际上会默认继承自object);也可以从某个已经存在的类继承。继承的类叫做subclass。
比如要构造蜘蛛这个类,可以从昆虫这个类继承。构建学生,雇员,战士都可以从人这个类继承。
继承的语法形式为:
class 类名(父类)
子类可以继承父类的所有方法和属性,也可以重载父类的成员函数及属性
多态
因为类具有继承关系,子类可以向上转型被看做是父类的类型,比如无论是战士还是快递员,都是人类。
也因为有了继承关系,子类可以继承父类的所有方法和属性,当然也可以重载父类的成员函数及属性。例如,当子类(直升机)和父类(飞机)都存在相同的fly()方法时,子类的fly()覆盖了父类的fly(),在运行时就总是会调用子类的fly()。这就是继承带来的多态。
super()
在子类中如果想调用父类中的方法,就需要使用super()方法。
实验
创建一个最简单的类
class employee(object):
def init(self,name,ID,title,salary,manager=None):
self.name=name
self.ID=ID
self.title=title
self.salary=salary
self.manager=manager
july=Employee(‘july’,1,‘CEO’,888888888)
创建类要使用class关键字。后面跟着的是类名employee,括号内部可以为空(默认自object),也可以写上其继承的父类名。
__init__为类的构造函数,第一个参数self为保留关键字,代表指向该实例。其后为初始化Employee类实例时的传入参数,
self.name及后边的语句,为指定该Employee类的实例对象july中的变量名name为初始化实例时传入的July。
接下来为创建该类的一个对象。方法很简单
,这里的july就是employee这个类的一个实例对象的名字了。
我们也可以这样看下这两者的对应关系。
创建有实例函数的类
class employee(object):
def init(self,name,ID,title,salary,manager=None):
self.name=name
self.ID=ID
self.title=title
self.salary=salary
self.manager=manager
def getinfo(self):
return ‘Employee Name:{}, ID:{}, Title:{},’.format(self.name,self.ID,self.title)
july=employee(‘july’,1,‘CEO’,888888888)
july.getinfo()
导入模块module说明
把以上的代码保存成Employee.py结尾的文件,放置在python可搜索到的路径下,模块的搜索路径可以使用import sys;sys.path变量来查看。py文件就是一个模块,就可以使用import classes来直接导入这个employee这个类了。
三种不同的导入模块的写法:
import Employee
from Employee import employee
from Employee import *
第一行的写法是导入Employee这个module,如果要调用这个module下的某个类,需要使用Employee.employee这样的格式。
第二行的写法是从Employee这个module中导入employee这个类
第三行的写法是从Employee这个module中导入所有对象
创造一个company类,并保存为Company.py
class company(object):
def init(self,name,employees=[]):
self.name=name
self.employees=employees
def hire(self,employee):
if not employee in self.employees:
print('adding ‘,employee ,’ to ',self.name)
self.employees.append(employee)
else: print(employee,’ is already exists’)
def fire(self,employee):
if employee in self.employees:
print('Firing ‘,employee ,’ from ',self.name)
self.employees.remove(employee)
else: print(employee,'is not in this company ')
def getInfo(self):
print(’{},has employee:{}’.format(self.name,self.employees))
最后创建一个main.py,导入前两个类
from Employee import employee
from Company import company
if name==‘main’:
july=employee(‘july’,1,‘CEO’,888888888)
print(july.getinfo())
hanxiaoyang=employee(‘xiaoyang’,2,‘lecturer’,1)
julyedu=company(‘julyedu.com’)
julyedu.hire(july)
julyedu.hire(hanxiaoyang)
julyedu.fire(hanxiaoyang)
print(julyedu.getInfo())
用dir命令来inspect一个object
一个对象内部具体有些什么,我们可以用dir(objectname)来观察。
类的承继
class person(object):
def init(self,name,ID):
self.name=name
self.ID=ID
def get_info(self):
return ‘name:{}’.format(self.name)
class student(Person):
def init(self,name,ID,level=0):
super().init(name,ID)
self.level=level
def get_info(self):
return ‘{}, level: {}’.format(super().get_info(),self.level)
def take_exam(self,grade):
if grade.upper() in [‘A’,‘B’,‘C’]:
self.level+=1
return self.level
def graduate(self):
super().get_info()
if self.level>=12:
print(‘you have graduated from julyedu.com’)
else:
print(‘failed, you have to finish {} scores to graduate’.format(12-self.level))
#使用
jack=student(‘david’,1,0)
jack.get_info()
for i in range(12):
jack.take_exam(‘A’)
jack.graduate()