python3 笔记 面向对象的一些方法

要让方法或属性成为私有的(不能从外部访问),只需让其名称以两个下划线打头即可。 如__inaccessible

虽然以两个下划线打头有点怪异,但这样的方法类似于其他语言中的标准私有方法。然而,幕后的处理手法并不标准:

在类定义中,对所有以两个下划线打头的名称都进行转换,即在开头

加上一个下划线和类名。
>>> Secretive._Secretive__inaccessible

只要知道这种幕后处理手法,就能从类外访问私有方法,然而不应这样做。
>>> s._Secretive__inaccessible()
 

要确定一个类是否是另一个类的子类,可使用内置方法issubclass
>>> issubclass(SPAMFilter, Filter)
True

如果你有一个类,并想知道它的基类,可访问其特殊属性__bases__
>>> SPAMFilter.__bases__
(<class __main__.Filter at 0x171e40>,)

同样,要确定对象是否是特定类的实例,可使用isinstance
>>> s = SPAMFilter()
>>> isinstance(s, SPAMFilter)
True
使用isinstance通常不是良好的做法,依赖多态在任何情况下都是更好的选择。一个重要

的例外情况是使用抽象基类和模块abc时。

如果你要获悉对象属于哪个类,可使用属性__class__
>>> s.__class__
<class __main__.SPAMFilter at 0x1707c0>

对于新式类(无论是通过使用__metaclass__ = type还是通过从object继承创建的)的实例,
还可使用type(s)来获悉其所属的类。对于所有旧式类的实例, type都只是返回instance

除非万不得已,否则应避免使用多重继
承,因为在有些情况下,它可能带来意外的“并发症”

使用多重继承时,有一点务必注意:如果多个超类以不同的方式实现了同一个方法(即有多 个同名方法),

必须在class语句中小心排列这些超类,因为位于前面的类的方法将覆盖位于后面
的类的方法。

检查所需的方法是否存在 :

>>> hasattr(tc, 'talk')
True

检查属性talk是否是可调用的。
>>> callable(getattr(tc, 'talk', None))
True

这里没有在if语句中使用hasattr并直接访问属性,而是使用了getattr(它让我能
够指定属性不存在时使用的默认值,这里为None),然后对返回的对象调用callable

抽象基类

from abc import ABC, abstractmethod
class Talker(ABC):
  @abstractmethod
  def talk(self):
    pass

这里的要点是你使用
@abstractmethod来将方法标记为抽象的——在子类中必须实现的方法。

抽象类(即包含抽象方法的类)最重要的特征是不能实例化。
>>> Talker()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Talker with abstract methods talk

猜你喜欢

转载自www.cnblogs.com/zsypython/p/9134073.html