python精要(65)-类(2)-构造函数

__init__(self[, ...])在实例创建( *__new__()*)之后调用,但在实例返回给调用方之前调用。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 22 08:35:42 2021

@author: myhaspl
"""


class Point:
    def init(self):
        self.x=0
        self.y=0
    def set(self,x,y):
        self.x=x
        self.y=y
    def setFromPoint(self,point):
        self.x=point.x
        self.y=point.y

b=Point()
b.init()
b.set(101, 102)
a=Point()
a.init()
print(a)
print(a.x)
print(a.y)
a.set(12,31)
print(a)
print(a.x)
print(a.y)
a.setFromPoint(b)
print(a)
print(a.x)
print(a.y)

1、通过def定义新的方法
2、可向类中方法,传入实例
3、使用__init__作为构造函数

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 22 08:35:42 2021

@author: myhaspl
"""


class Point:
    def __init__(self,x=0,y=0):
        self.set(x,y)
    def set(self,x,y):
        self.x=x
        self.y=y
    def setFromPoint(self,point):
        self.x=point.x
        self.y=point.y


b=Point(10,20)
print(b.x)
print(b.y)
b.set(101, 102)
print(b.x)
print(b.y)

a=Point()
print(a.x)
print(a.y)
10
20
101
102
0
0

4、也可使用__new__作为构造函数
(1)仅一个参数
(2)没有self参数,因此,在构造对象之前调用,因此,它必须返回新创建的对象。

调用以创建类cls的新实例。__new __()是一个静态方法(特殊情况下,您不必声明它),它将请求实例的类作为其第一个参数。其余的参数是传递给对象构造函数表达式(对类的调用)的参数。new()的返回值应该是new object实例(通常是cls的实例)。
典型的实现创建一个类的新实例,方法是使用super()调用超类的 new() ,使用适当的参数调用super().new(cls[, …])

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 22 08:35:42 2021

@author: myhaspl
"""


class Point:
    def __new__(cls,x=0,y=0):
        print("new")
        return object.__new__(cls)
    def __init__(self,x=0,y=0):
        print("init")
        self.set(x,y)
    def set(self,x,y):
        self.x=x
        self.y=y
    def setFromPoint(self,point):
        self.x=point.x
        self.y=point.y


b=Point(10,20)
print(b.x)
print(b.y)
b.set(101, 102)
print(b.x)
print(b.y)

a=Point()
print(a.x)
print(a.y)

Point类没有定义继承的父类,因此,其父类为object,因为所有python类都是object的子类。

如果在对象构造过程中调用了 __new__() ,并且它返回了cls的一个实例或子类,那么新实例的__init__() 方法将像 __init__(self[, ...]),其中self是新实例,其余参数与传递给对象构造函数的参数相同。
如果_new__()不返回cls的实例,则不会调用新实例的__init__() 方法。
new()主要用于允许不可变类型(如int、str或tuple)的子类自定义实例创建。为了自定义类的创建,它通常在自定义元类中被重写。

构造单例

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Feb 22 08:35:42 2021

@author: myhaspl
"""


class Point:
    def __new__(cls):
        'new调用此方法后,'
        if not hasattr(cls, 'instance'):
            cls.instance=super(Point, cls).__new__(cls)
        return cls.instance        
    def __init__(self)
        print("init")
    def set(self,x,y):
        "设置点对象的坐标值"
        self.x=x
        self.y=y




b=Point()
b.set(101, 102)
print(b.x)
print(b.y)

a=Point()
a.set(1010, 1020)
print(a.x)
print(a.y)
print(b.x)
print(b.y)

此时对Point()的多次调用,永远只返回一相同的实例

init
101
102
init
1010
1020
1010
1020
相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页