1、面向对象编程
Python是一门面向对象程序语言,面向对象语言编码的过程叫作面向对象编程。
面向对象编程(OOP)是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含数据和操作数据的函数。
面向对象程序设计把计算机程序视为一组对象的集合,每个对象都可以接受其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
在Python中,所有数据类型都被视为对象,也可以自定义对象,自定义对象数据类型就是面向对象中的类的概念。
- 类:用来描述具有相同属性和方法的对象的集合。类定义了集合中每个对象共有的属性和方法。对象是类的实例
- 类变量(属性):类变量在整个实例化的对象中是公用的。类变量定义在类中,且在方法之外。类变量通常不作为实例变量使用。类变量也称作属性
- 数据成员:类变量或实例变量用于处理类及其实例对象的相关数据
- 方法重写:如果从父类继承的方法不能满足子类的需求,就可以对其进行改写,这个过程称为方法的覆盖,也称为方法的重写
- 实例变量:定义在方法中的变量只作用于当前实例的类
- 多态:对不同类的对象使用同样的操作
- 封装:对外部世界隐藏对象的工作细节
- 继承:即一个派生类继承基类的字段和方法。继承允许把一个派生类的对象作为一个基类对象对待,以普通类为基础建立专门的类对象
- 实例化:创建一个类的实例、类的具体对象
- 方法:类中定义的函数
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
和其他编程语言相比,Python在尽可能不增加新语法和语义的情况下加入了类机制。Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类、派生类可以覆盖基类中的任何方法、方法中可以调用基类中的同名方法。对象可以包含任意数量和类型的数据。
2、类的定义
类定义的语法格式如下:
class Class Name(object)
<statement -1>
.
.
.
<statement -N>
由代码片段和类定义我们看到,Python中定义类使用class关键字,class后面紧接着类名,如实例中的MyClass,类名通常是大写开头的单词;紧接着是(object),表示该类是从那个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是多有类最终都会继承的类。类包含属性和方法。
在类定义方法的形式核函数差不多,但不成为函数,而称为方法。方法的调用需要绑定到特定对象上,而函数不需要。
3、类的使用
类对象支持:属性引用、方法引用和实例化。
class MyClass(object)
i = 123
def f(eslf):
return ‘hello world’
use_class = MyClass()
print(‘类属性:’ , use_class.i)
print(‘类方法:’ , use_class.f())
类属性:123
类方法:hello world
类对象创建后,类命名空间中所有的命名都是有效属性名。use_class = MyClass() ,这步叫做类的实例化,即创建一个类的实例。此处得到的use_class变量称为类的具体对象;use_calss.i 用于调用类的属性,即类变量;use_class.f() 用于调用类的方法。
1)类的属性
属性引用使用和Python中所有的属性引用一样的标准语法:obj.name。
属性引用的标准语法为:
obj.name
obj代表类对象,name代表属性
类的私有属性
__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
2)类的方法
对于类方法定义的要求:在类中定义方法时,第一个参数必须是self。除第一个参数外,类的方法和普通函数没有什么区别,如可以用默认参数、可变参数、关键字参数和命名关键字参数等。
对于在类中调用方法的要求:要调用一个方法,在实例变量上直接调用即可。除了self不用传递,其他参数正常传入。
#!/usr/bin/python3
#类定义
class people:
#定义基本属性
name = ''
age = 0
#定义私有属性,私有属性在类外部无法直接进行访问
__weight = 0
#定义构造方法
def __init__(self,n,a,w):
self.name = n
self.age = a
self.__weight = w
def speak(self):
print("%s 说: 我 %d 岁。" %(self.name,self.age))
# 实例化类
p = people('runoob',10,30) p.speak()
执行以上程序输出结果为:
runoob 说: 我 10 岁。
类的私有方法
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类地外部调用。self.__private_methods。
3)类的实例
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。
class Test: def prt(self): print(self) print(self.\__class__) t = Test() t.prt()
以上实例执行结果为:
<\__main__.Test instance at 0x100771878>
\__main__.Test
从执行结果可以很明显的看出,self 代表的是类的实例,代表当前对象的地址,而 self.class 则指向类。
self 不是 python 关键字,我们把他换成 runoob 也是可以正常执行的:
class Test: def prt(runoob): print(runoob) print(runoob.\__class__) t = Test() t.prt()
以上实例执行结果为:
<\__main__.Test instance at 0x100771878>
\__main__.Test
4、类的构造方法
很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为\ init() 的特殊方法(构造方法),像下面这样:
def \__init__(self): self.data = []
类定义了\ init() 方法的话,类的实例化操作会自动调用 __init__() 方法。所以在下例中,可以这样创建一个新的实例:
x = MyClass()
当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。例如:
#!/usr/bin/python3
class Complex:
def __init__(self, realpart, imagpart):
self.r = realpart
self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)
# 输出结果:3.0 -4.5