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)
题:
__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'>
Run Code Online (Sandbox Code Playgroud)由于你没有在类上定义__repr__(或__str__),它继承了超类中的一个 - object以及它是如何写在那里的.因此,所有类实例都以这种方式表达.至于类本身,你需要改变元类的__repr__/ __str__,即我们所讨论的类是其实例的类; 默认的元类是type.__main__是模块的名称,在这里您直接执行它,它被视为脚本,所有脚本都__main__在Python中具有名称
有一个.在两者之间,因为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__为类属性.