了解类类型'__main __.ClassName'

The*_*rer 2 python oop python-2.7

码:

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()
Run Code Online (Sandbox Code Playgroud)

输出:

<class '__main__.Fraction'>
Run Code Online (Sandbox Code Playgroud)

题:

  1. 为什么是类型__main__.Fraction而不仅仅是Fraction
  2. 为什么会有"." 之间__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'>
    
    Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 6

  1. 由于你没有在类上定义__repr__(或__str__),它继承了超类中的一个 - object以及它是如何写在那里的.因此,所有类实例都以这种方式表达.至于类本身,你需要改变元类的__repr__/ __str__,即我们所讨论的类是其实例的类; 默认的元类是type.__main__是模块的名称,在这里您直接执行它,它被视为脚本,所有脚本都__main__在Python中具有名称

  2. 有一个.在两者之间,因为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...
Run Code Online (Sandbox Code Playgroud)

对于Python2,您需要定义__metaclass__为类属性.


Ign*_*ams 5

正在运行的脚本的名称始终为__main__。这就是为什么要检查这个特定名称,以及为什么脚本中定义的类是它的属性。