python之__init__

Posted yuyafeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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: 第一个字母必须大写
‘‘‘

 

以上是关于python之__init__的主要内容,如果未能解决你的问题,请参考以下文章

python之__init__

python之__init__使用方法

Python中__init__.py文件作用之我见

python之_init_()方法浅析

Python内置函数之super()

面对对象之继承 | Python