1. 面向对象编程简介
面向对象编程是最有效的代码(不仅限于Python)编写方式之一。在编写代码时,可以把现实中要表达的事物或情景抽象为类(class)
,并基于这些类来创建对象。
在Python语言中,根据类来创建对象称为实例化
,简单来说创建好的类只是一个框架,要实例化之后才能使用。而函数创建好之后在后面可以直接调用,这是Python中类与函数的不同之处。
类中的函数称为方法(Method)
,Python中函数相关的语法规则基本都适用于类中的方法。但是在方法中有些格式如__xxxx__()
的特殊方法,称为魔术方法
。例如最常用、最常见的__init__()
方法,每当类进行实例化的时候__init__()
方法都会自动运行,因此它也被用于类的初始化。
2. Python中面向对象编程实例
下面按顺序讲解一个完整的Python创建类的实操:
2.1 创建一个类
class demo(): def __init__(self): print("this is a demo") def byten(self, x): self.x = x self.y = self.x * 10
这个名为demo的类有两个方法:__init__()
和byten()
。
2.2 类的实例化
DEMO = demo()
上文已经说过:创建好的类不能直接使用,必须先实例化。在这个示例中demo类被实例化为DEMO实例。
这里必须要讲解一个形参:self
。上面说过了方法就是类中的函数,那上面demo类中这两个方法显然都不需要形参self
,那它的作用是什么?
self
的作用是在实例化过程中,把实例DEMO作为实参传入形参self
,这样类demo就可以通过self
把方法和属性
传递给实例DEMO,允许实例DEMO调用类demo的方法和属性
。因此形参self
在每个方法中都是必要的,而且必须放在首位。
关于self的理解,可以参考我的另一篇文章:Python类(class)中self的理解
上面提到的属性(Attribute)
是指以self开头的变量,例如self.x
,这些变量(属性)可供类中的所有方法使用。
回到代码上来,在实例化后运行代码就会有输出:
this is a demo
因为上面说明了__init__()
方法在实例化时会自动运行。
2.3 输入实参
传入实参的方式和Python中函数一致,这时就不用考虑self
了:
DEMO.byten(8) print(DEMO.y)
输出为:
80
2.4 实例的物理地址
这里为了更好理解实例化过程,我们再进行以下示例:
DEMO1 = demo() DEMO2 = demo() DEMO3 = DEMO1 print(DEMO1,'\n',DEMO2,'\n',DEMO3 )
输出为:
<__main__.demo object at 0x0000026096601DF0> <__main__.demo object at 0x0000026096601FA0> <__main__.demo object at 0x0000026096601DF0>
这里代码中虽然都是“=”,但其含义并不同。前面两行是类的实例化过程,创造了DEMO1和DEMO2两个示例,因此其物理地址也不同。而第三行的"="纯粹是给DEMO1对应的内存加了一个名字DEMO3,并没有创造新的地址。
也可以这样理解:类demo就是一个PPT模板,而实例DEMO1和实例DEMO2是要使用该demo模板制作的有实际用途的PPT,因此DEMO1和DEMO2是两份独立的PPT。而DEMO3相当于是DEMO1的快捷方式,它本身并不占内存而是和DEMO1共用一份PPT文件。
3. 完整代码
class demo(): def __init__(self): print("this is a demo") def byten(self, x): self.x = x self.y = self.x * 10 # DEMO = demo() # DEMO.byten(8) # print(DEMO.y) DEMO1 = demo() DEMO2 = demo() DEMO3 = DEMO1 print(DEMO1,'\n',DEMO2,'\n',DEMO3 )