代码:

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/

    10-12 17:12