面向对象程序设计(英语:Object-oriented programming,缩写:OOP)是一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的实例。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。
我们之前已经写了不少小程序,都是按照功能需求的顺序来设计程序。这种被称为“面向过程”的编程。
面向对象编程最主要的两个概念就是:类(class)和对象(object)。
类是一种抽象的类型,而对象是这种类型的实例。
举个现实的例子:“笔”作为一个抽象的概念,可以被看成是一个类。而一支实实在在的笔,则是“笔”这种类型的对象。
一个类可以有属于它的函数,这种函数被称为类的“方法”。一个类/对象可以有属于它的变量,这种变量被称作“属性”。
self在类方法中的值,就是你调用的这个对象本身。
类的属性分为类属性和实例属性,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,类属性是在类里面定义的,而实例属性是在方法里面定义的。
class Province: # 类属性 country = "China" def __init__(self, name): # 实例属性 self.name = name obj_henan = Province("HeNan") print(obj_hunan.name) # 使用对象访问实例属性 print(Province.country) # 使用类访问类属性由上述代码可以看出【实例属性需要通过对象来访问】【类属性通过类访问】,在使用上可以看出他们的归属是不同的。
类的方法方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self; 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls; 静态方法:由类调用;无默认参数;
类方法是静态方法的一种特殊形式,自带特殊参数cls,使用装饰器 @classmethod,跟静态方法一样可以通过类名直接调用。
class Foo: @classmethod def print_info(cls): #cls = class print('学生%s,已经就读于本校%s专业'%(name,technical)) Foo.print_info()很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 init() 的特殊方法(构造方法)。
类定义了__init__()方法的话,类的实例化操作会自动调用 init() 方法。当然,init()方法可以有参数,参数通过__init__()传递到类的实例化操作上。
class student(): def __init__(self,name,technical): self.name = name self.technical = technical def print_stu_info(self): print('学生%s,已经就读于本校%s专业' %(self.name,self.technical)) student('Alex','computer').print_stu_info()私有属性和方法只能在类内部使用,类外部则无法调用。语法则为以两个下划线开头。
class students: def __init__(self): self.name = '小明' self.__age = 22 #私有属性 self.__red() #私有方法可以在类内部调用 def __red(self):#私有方法 print('%s在读书'%self.name) def ages(self): print('%s今年%d岁了'%(self.name,self.__age))#私有属性在类内部调用 s = students() print(s.name) s.ages()私有化属性、和方法在类外面还有可以调用的。其实python中属性、方法的私有化并不是真正意义上的私有化,这只是python耍了一个小聪明,在属性、方法前面加上两个下划线后,在程序解释运行时会在前面自动加一个带下划线的类名。
面向对象编程是一种编程方式,此编程方式的落地需要使用 “类” 和 “对象” 来实现,所以,面向对象编程其实就是对 “类” 和 “对象” 的使用。
封装:即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
在使用面向对象的封装特性时,需要:
将内容封装到某处
从某处调用被封装的内容
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。继承完全可以理解成类之间的类型和子类型关系。
在Python中,可以让一个类去继承一个类,被继承的类称为父类或者超类、也可以称作基类,继承的类称为子类(派生类)。并且Python支持多继承,能够让一个子类有多个父类。语法如下:
class DerivedClassName(ClassName)注意:在继承中子类重写了父类的方法后,想要在子类里继续调用父类的方法用super().method()调用。
Python动态数据类型,导致传统面向对象语言中的重载失去了意义,例如:
class car: def wheels(self,number): print('This car has %s wheels'%number) def wheels(self,number,brand): print('This car has %s %s wheels'%(number,brand))从上面的例子中,我们发现:实例化对象根本找不到第一个wheels的方法!
a、物:对象、对象之间的关系(儿子、父亲;老板、员工)
b、事:对象之间的交互(司机开车,厨师做饭)
老虎、羊、房间
同样的的方法调用,在不容类型的对象上会表现出不同的特性,称之为多态