关于python:我们可以重载类对象的行为吗?

Can we overload behavior of class object

本问题已经有最佳答案,请猛点这里访问。

我知道我们可以重载类实例的行为,例如-

1
2
3
4
5
6
class Sample(object):  pass
s = Sample()
print s
<__main__.Sample object at 0x026277D0>
print Sample
<class '__main__.Sample'>

我们可以改变print s的结果:

1
2
3
4
5
6
class Sample(object):
  def __str__(self):
    return"Instance of Sample"
s = Sample()
print s
Instance of Sample

我们能改变print Sample的结果吗?


可以使用元类:

1
2
3
class SampleMeta(type):
    def __str__(cls):
        return ' I am a Sample class.'

Python 3:

1
2
class Sample(metaclass=SampleMeta):
    pass

Python 2:

1
2
class Sample(object):
    __metaclass__ = SampleMeta

输出:

1
I am a Sample class.

元类是类的类。它与类的关系类似于类与实例的关系。使用相同的class语句。从object继承形式type,使其成为元类。按照惯例,selfcls代替。