代码:
class Fraction(object):
def __init__(self, num, denom):
self.numerator = num
self.denominator = denom
def main():
f = Fraction(1, 3)
print type(f)
if __name__ == "__main__":
main()
输出:
<class '__main__.Fraction'>
问题:
__main__.Fraction
而不是Fraction
? __main__
和Fraction
之间? “。”表示Fraction
是__main__
的子类。但为什么?即使我从代码中删除了If __name__ == "__main__"
,我仍然得到相同的输出:class Fraction(object):
def __init__(self, num, denom):
self.numerator = num
self.denominator = denom
f = Fraction(1,3)
print type(f)
output: <class '__main__.Fraction'>
最佳答案
__repr__
(或__str__
),因此它是从父类(super class)object
继承而来的,它是如何在其中编写的。因此,您所有的类实例都以这种方式表示。至于类本身,您需要更改元类上的__repr__
/__str__
,即所讨论的类是其实例的类;默认的元类是type
。 __main__
是模块的名称,在这里您直接执行它时就将其视为脚本,并且所有脚本在Python中的名称均为__main__
.
,因为Fraction
是脚本__main__
(模块)的属性。属于模块级别范围示例:
In [47]: class MyMeta(type):
...: def __repr__(cls):
...: return 'Whatever...'
...:
In [48]: class MyClass(metaclass=MyMeta):
...: def __repr__(self):
...: return 'Howdy...'
...:
In [49]: obj = MyClass()
In [50]: print(obj)
Howdy...
In [51]: print(type(obj))
Whatever...
对于Python2,您需要将
__metaclass__
定义为类属性。关于python - 了解类类型 '__main__.ClassName',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48845989/