了解类类型'__main __。ClassName'

时间:2018-02-17 21:13:06

标签: python python-2.7 oop

代码:

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'>

问题:

  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'>
    

2 个答案:

答案 0 :(得分:6)

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

  2. 介于.之间,因为Fraction是脚本__main__的属性,模块;并且属于模块级范围

  3. 示例:

    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__定义为类属性。

答案 1 :(得分:4)

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