python中的几个高级问题详解(__init__,装饰器运行步骤,@staticmethod和@classmethod区别,单例模式,魔法方法,object继承与不继承区别)

第一个问题,init
在定义一个类时,什么时候用__init__函数,什么时候不用,用不用有什么区别?

首先__init__是为了初始化用的,但是初始化的时候不一定要用这个,直接定义也是可以的,比如

class A(object):
	test_a = '123'

而我们用__init__的好处在于可以接受任何参数并初始化

def __init__(self,a):
	test_a = a

这样类可以初始化一个动态的变量,更加灵活,直接test(‘123’)就将test_a初始化成123了
再举一个例子,如下

# 不用init方法定义类
class Rectangle(object):
    def getPeri(self,a,b):
        return (a+b)*2
    def getArea(self,a,b):
        return a*b
rec = Rectangle()
print(rec.getPeri(3,4))  # 14 
print(rec.getArea(3,4))  # 12
print(rec.__dict__)  # {}

从上例可以看到,没有定义__init__方法,也能得到周长和面积,但是通过rec.__dict__来看这个实例的属性,是空的,这就是没有定义__init__的原因。
并且,在实例化对象时,rec=Rectangle()参数为空,没有指定a,b的值,只有在调用函数的时候才指定,且类中定义的每个方法的参数都有a,b,有点多余了。
因此,需要在类中定义__init__方法,方便创建实例的时候,需要给实例绑定上属性,也方便类中的方法定义。
上述同样的例子,用__init__方法定义类,如下

# 使用__init__方法定义类
class Rectangle(object):
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def getPeri(self):
        return (self.a+self.b)*2
    def getArea(self):
        return self.a*self.b

rec = Rectangle(3,4)
print(rec.getPeri())  # 14
print(rec.getArea())  # 12
print(rec.__dict__)  # {'a': 3, 'b': 4}

定义完init()方法后,创建的每个实例都有自己的属性,也方便直接调用类中的函数。

猜你喜欢

转载自blog.csdn.net/HARD_FAN/article/details/84200998