ITxiaobaibai 2019-06-28
Python里对类的实例化时有怎样的顺序
一般来说一个类里面有类变量和方法,比如我们定义一个名为A的类
class A():
bar = "my lover love me"
def __init__(self, name):
print('A的class' ,self.__class__, name)我们在这个类里面定义了一个类变量bar和一个构造方法__init__,那么我们实例化A()时都发生了什么呢!看官不要急,听我慢慢道来...
__new__方法将类实例化,此时完成了第一步类变量:不用实例化也可以访问。
实例变量:是动态创建的。必须实例化之后才可以访问,因为之前是不存在的。
比如下面这个例子:不实例化访问类变量
class A():
a = 2
print(A.a)
输出:
>>>2说了这么多,上代码。看看类继承时怎么运行的:
class A():
def __init__(self, name):
print('A的class' ,self.__class__, name)
class B(A):
def __init__(self, name):
self._name = name
A.__init__(self, name)
print('B的class', self.__class__, name)
print('this is B class')
class C(B):
def __init__(self, name):
B.__init__(self, name)
print('C的class')
if __name__ == '__main__':
c = C('lee')输出如下:
this is B class来现身说法,解释一波
随便补充一下使用type关键字动态创建类的知识点,敲黑板、、、我要用CET3.5的英语水平向大家翻译一部分官方文档对type的描述啦。
使用三个参数,返回一个新类型对象。这实际上是类语句的动态形式。名称字符串是类名,并成为__name__属性;基元元组列出基类并成为>__bases__属性;并且dict字典是包含类主体定义的命名空间,并被复制到标准字典以成为__dict__属性。怎么样,是不是很拗口,是不是大写的懵*。so,上代码,以下两种写法输出一样的都是输出:重写name方法 1
class X():
a = 1
def __name__(self):
return '重写name方法'
x =X()
print(x.__name__(), x.a)X = type('重写name方法', (object,), dict(a = 1))
x = X()
print(X.__name__, x.a)type动态创建实例化时,第一个参数就相当于重写了类的__name__方法。X类但__name__属性却不叫X,呵,好反人类的写法
还好我们一般不是这么变态,通常我们会将这两个定义成相同的名字,如下:都叫X
X = type('X', (object,), dict(a = 1))
欢迎大家踊跃评论,提出建议哦~
先更新到这里。。。。 2018/10/09