Python的程序结构[1] -> 方法/Method[0] -> 类实例方法、私有方法和抽象方法

时间:2021-01-19 10:41:47

类实例方法、私有方法和抽象方法


Python中最常用的就是类实例方法,类似于属性中的类实例属性,同时,也存在与私有属性类似方法,即私有方法,下面介绍这两种常见的方法,以及一种特殊意义的类实例方法 -- 抽象方法。

 

类实例方法 / Instance Method


类实例方法通过关键字 def 进行定义,第一个参数默认为 self,可利用 self / 类实例 对方法进行调用,是最基本的一种方法

1 class Foo(object):
2     def foo(self):
3         print("This is foo method.")
4 
5 f = Foo()
6 f.foo()

上面的代码中定义了一个 Foo 类,然后定义了一个类实例的方法 foo,在第 5 行中,通过类生成了一个类实例 f ,然后利用 f.foo() 实现对类实例方法的调用 (除了这种方式外,还可以通过 getattr / __getattribute__ 等方式来获取这个 foo 方法)。

最终可以看到,console 中输出了 foo 方法所 print 的内容

This is foo method.


私有方法 / Private Method


Python中没有类似其他语言的 public, private 等关键词进行修饰。在 Python 中定义私有方法与私有属性类似,只需要在方法的前面加上 ‘__’ 两个下划线。在内部,Python 使用一种 name mangling 技术,将 __membername 替换成 _classname__membername,所以你在外部使用原来的私有成员的名字时,会提示找不到。

Note: 此处的 __membername 不可写成 __membername__,否则将不是私有方法而变成魔术方法

 1 class Foo():
 2     def __privatemethod(self):
 3         print('This is a private method.')
 4 
 5     def _privatemethod_callable(self):
 6         print('This is a private method but callable.')
 7 
 8 f = Foo()
 9 f._Foo__privatemethod()
10 f._privatemethod_callable()

与前面类似,在类中定义了两个私有方法,这里与私有属性相同,单下划线代表声明是一个内部的私有方法,但是依旧可以从外部进行调用,而双下划线则说明这是一个收保护的私有方法。定义完成后生成一个类的实例,并对私有方法进行调用,从调用的方式可以看出, name mangling 所起到的作用。

This is a private method.
This is a private method but callable.

 

抽象方法 / Abstract Method


Python中的抽象方法是一种定义于基类的方法,任何继承该基类的方法都需要重新定义该方法。最简单的抽象方法定义方式如下:

1 class Foo():
2     def abmethod(self):
3         raise NotImplementedError

但是这种方法的弊端在于只有当调用的时候才能检测子类是否重定义了该方法,为此 Python 提供了一个 abc 模块,使得抽象方法在初始化阶段就可以检测是否重定义(参考abc模块部分)。该方法通过@abstractmethod进行装饰。

 

相关阅读


1. abc 模块