1.请问如何修改以下Python代码,使得下面的代码调用类A的show方法? class A(object) def show(self): print 'derived show' class B(A) def show(self): print 'derived show' obj=B() obj.show()
答:类的继承__class__方法指向了类对象,只用给他赋值类型A,然后调用方法show,但是用完了记得修改回来。
obj = B() obj.__class__ = A obj.show()
2.请问如何修改以下Python代码,使得代码能够运行? class A(object): def __init__(self, a, b): self.__a = a self.__b = b def myprint(self): print('a=', self.__a, 'b=', self.__b) a1=A(10,20) a1.myprint() a1=(80)
答:
class A(object): def __init__(self, a, b): self.__a = a self.__b = b def myprint(self): print('a=', self.__a, 'b=', self.__b) def __call__(self, num): print('call:', num + self.__a) a1=A(10,20) a1.myprint() a1=(80)
总结:
一个类实例也可以变成一个可调用对象,只需要实现一个特殊方法__call__()。
只要某个类型中有__call__方法,,我们可以把这个类型的对象当作函数来使用。 我们把 Person 类变成一个可调用对象: class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __call__(self, friend): print 'My name is %s...' % self.name print 'My friend is %s...' % friend 现在可以对 Person 实例直接调用: >>> p = Person('Bob', 'male') >>> p('Tim') My name is Bob... My friend is Tim...
3.下面代码输出什么? class B(object): def fn(self): print 'B fn' def __init__(self): print "B INIT" class A(object): def fn(self): print 'A fn' def __new__(cls,a): print "NEW", a if a>10: return super(A, cls).__new__(cls) return B() def __init__(self,a): print "INIT", a a1 = A(5) a1.fn() a2=A(20) a2.fn()
答:
NEW 5
B INIT
B fn
NEW 20
INIT 20
A fn
new方法接受的参数虽然也是和init一样,但init是在类实例创建之后调用,而 new方法正是创建这个类实例的方法。
1.init 通常用于初始化一个新实例,控制这个初始化的过程,比如添加一些属性, 做一些额外的操作,发生在类实例被创建完以后。它是实例级别的方法。
2.new 通常用于控制生成一个新实例的过程。它是类级别的方法。
cls和self的区别:cls是类本身的一个对象,self是类实例的一个对象