Python面向对象编程

类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()

上一篇:leetcode-mysql 2021-06-02


下一篇:oracle数据库的权限和角色及建表插数