python之__init__

__init__为Python中的构造函数

在对象实例化时,负责对对象的初始化,它并不算真正意义的构造函数,它做的事是在对象创建好之后初始化变量,真正创建实例的是__new__方法

class Foo:
    def __init__(self):
        pass


obj = Foo()
print(obj.__dict__)
'''
{}
'''
class Foo:
    def __init__(self, name, age):
        self.name = name
        self.age = age


obj = Foo('yyf', 18)
print(obj.__dict__)
'''
{'name': 'yyf', 'age': 18}
'''

 

类加括号实例化对象的步骤

1, 创建一个该类的空对象   __new__

2, 实例化该空对象  __init__

3, 将实例化的空对象返回  return cls

 

重写__init__

1. 该方法是从type中继承来的,所以参数同type的init

2. 最终的工作(如果开辟空间,如果操作内存)还是要借助type

3. 再交给type最终完成工作之前,可以对垒的创建加以限制

class MyMetaClass(type):   # 要重写init必须继承type
    def __init__(self, class_name, class_bases, class_addrs):
        print(class_name)  # 类名
        print(class_bases)  # 继承的基类
        print(class_addrs)  # 名称空间
     super().__init__(class_name, class_bases, class_addrs) # 最终还是要借助type
class Foo(metaclass=MyMetaClass): def __init__(self): pass obj = Foo() # Foo = MyMetaClass(class_name, class_bases, class_addrs)

'''

  Foo
  ()
  {'__module__': '__main__', '__qualname__': 'Foo', '__init__': <function Foo.__init__ at 0x032D8738>}

'''

 

案例一

class MyMetaClass(type):
    def __init__(self, class_name, class_bases, class_addrs):
        print(class_name)
        if not class_name.istitle():
            raise TypeError('第一个字母必须大写')
            super().__init__( class_name, class_bases, class_addrs)


class foo(metaclass=MyMetaClass):
    def __init__(self):
        pass


obj = foo()
'''
foo
Traceback (most recent call last):
  File "D:/Python/02/myinit.py", line 48, in <module>
    class foo(metaclass=MyMetaClass):
  File "D:/Python/02/myinit.py", line 44, in __init__
    raise TypeError('第一个字母必须大写')
TypeError: 第一个字母必须大写
'''

 

posted @ 2019-05-31 22:19  yyfgrd  阅读(206)  评论(0编辑  收藏  举报