原始代碼python
class A(object): def run(self): print("基礎 run 方法") class B(A): def run(self): print("衍生 run 方法 ") obj = B() obj.run()
面試要點:程序員
類繼承,只要經過
__class__
方法指定類對象就能夠了。面試
修改代碼編程
class A(object): def run(self): print("基礎 run 方法") class B(A): def run(self): print("衍生 run 方法 ") obj = B() obj.__class__ = A obj.run()
原始代碼函數
class A(object): def __init__(self,a,b): self.__a = a self.__b = b def show(self): print("a=",self.__a,"b=",self.__b) a = A(5,10) a.show() a(20)
面試要點:code
是方法對象,爲了能讓對象實例能被直接調用,須要實現
__call__
方法對象
修改代碼繼承
class A(object): def __init__(self,a,b): self.__a = a self.__b = b def show(self): print("a=",self.__a,"b=",self.__b) def __call__(self, num): print("call:",num + self.__a) a = A(5,10) a.show() a(20)
原始代碼get
class B(object): def __init__(self): print("B init") def run(self): print("B run func") class A(object): def run(self): print("A run func") 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.run() a2 = A(20)
這個運行須要對代碼比較熟悉了it
結果以下
# a1 = A(5) new 5 B init # a1.run() new 5 B init B run func # a2 = A(20) new 5 B init B run func new 20 init 20
原始代碼
num = 9 def fn1(): num = 20 def fn2(): print(num) fn2() # 9 fn1() # 啥都沒有 fn2() # 9
全局變量和局部變量。
num 不是個全局變量,因此每一個函數都獲得了本身的 num 拷貝,若是你想修改 num ,則必須用 global 關鍵字聲明
原始代碼
class A(object): def __init__(self,a,b): self.a1 = a self.b1 = b print("初始化方法") def myfunc(self): print("myfunc") a1 = A(10,20) a1.fn1() a1.fn2() a1.fn3()
修改代碼
class A(object): def __init__(self,a,b): self.a1 = a self.b1 = b print("初始化方法") def myfunc(self): print("myfunc") def __getattr__(self, item): return self.myfunc a1 = A(10,20) a1.fn1() a1.fn2() a1.fn3()
考點
python的默認方法, 只有當沒有定義的方法調用時,纔會調用方法__getattr__
。
當 fn1 方法傳入參數時,咱們能夠給 myfunc方法增長一個 *args 不定參數來兼容。
用自學的經歷告訴你,學編程就找夢想橡皮擦
歡迎關注她的公衆號,搜索--- 非本科程序員