类(Class)和实例(Instance)
类是抽象的模板
实例是根据类创建出来的一个个具体的“对象”
每个对象都拥有相同的方法,但各自的数据可能不同
方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问实例的数据;
super
class OldDog():
def __init__(self):
print('I am an old dog !')
self.hungry = True
def eat(self):
if self.hungry:
print('I eat it !')
self.hungry = False
else:
print('No thanks!')
class NewDog(OldDog):
def __init__(self):
super().__init__()
print('I am a new dog!')
olddog = OldDog()
olddog.eat()
olddog.eat()
newdog = NewDog()
newdog.eat()
newdog.eat()
当子类继承父类的时候,我们继承了父类的方法。子类中含有__init__时,不会自动调用父类__init__,如需使用父类__init__中的变量,则需要在子类__init__中显式调用
repr
返回实例化对象的表达
class MyClass() :
def __str__(self) :
return "我是MyClass的一个实例"
def __repr__(self) :
return "这回连print都省了"
a=MyClass()
>>> print(a)
我是MyClass的一个实例
>>> a
这回连print都省了
一个flask json返回值的问题
https://www.v2ex.com/t/195379
new__、__init__、__call
__new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)
__init__ : 对象的初始化, 是一个实例方法,第一个参数是self。
__call__ : 对象可call,注意不是类,是对象
先有创建,才有初始化。即先__new__,而后__init__。
class Bar(object):
pass
class Foo(object):
def __new__(cls, *args, **kwargs):
return Bar()
print Foo()
输出来是一个Bar对象
class Person(object):
"""Silly Person"""
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return '<Person: %s(%s)>' % (self.name, self.age)
if __name__ == '__main__':
piglei = Person('piglei', 24)
print piglei
这样便是__init__最普通的用法了。但__init__其实不是实例化一个类的时候第一个被调用 的方法。
当使用 Persion(name, age) 这样的表达式来实例化一个类时,最先被调用的方法 其实是 __new__ 方法。
对象通过提供__call__(slef, [,*args [,**kwargs]])方法可以模拟函数的行为,如果一个对象x提供了该方法,就可以像函数一样使用它,也就是说x(arg1, arg2...) 等同于调用x.__call__(self, arg1, arg2) 。模拟函数的对象可以用于创建防函数(functor) 或代理(proxy).
class Foo(object):
def __call__(self):
pass
f = Foo()#类Foo可call
f()#对象f可call