代码:
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'>
答案 0 :(得分:6)
由于您尚未在课程中定义__repr__
(或__str__
),因此它继承了超类中的一个 - 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__
定义为类属性。
答案 1 :(得分:4)
正在运行的脚本的名称始终为__main__
。这就是为什么要检查这个特定的名称,以及为什么脚本中定义的类是它的属性。