最近在学习python相关的东西,查看别人的代码,有很多地方看不太懂,就写了一些简单的代码来debug 这个调用类的实例化的逻辑
下面写了两个文件
Inherit_test_head.py
class Animal:
def Init(self):
pass
def __init__(self, raiseError=False):
self.A="I'M A"
self.B="I'M B"
self._initPer()
print(self.A,self.B)
def _initPer(self):
self.p=CParameter("p")
self.p.k="PK"
print(self.p.k)
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def Header():
print("Enter hearder")
def speak(self):
return "Woof!"
class CParameter:
def __init__(self, name, nameUnique = None):
# Attention: because we changed __setattr__ it is
print("Enter Cparameter")
TDog=Dog()
主程序
Inherit_test.py
import Inherit_test_head
class Person:
def __init__(self, name):
self.name = name
print(self.name)
def greet(self, animal):
return f"Hello, {self.name} says {animal.name}: {animal.speak()}"
def Main(self):
Inherit_test_head.TDog("I am a pink dog")
# 创建一个Person实例
my_person = Person("Alice")
运行Inherit_test.py 结果如下:
因为import的文件里面定义了一个类的对象,因此会调用Animal 类的构造函数进行一些初始化操作
修改主程序 Inherit_test.py,创建一个类调用主程序中的Main函数
import Inherit_test_head
class Person:
def __init__(self, name):
self.name = name
print(self.name)
def greet(self, animal):
return f"Hello, {self.name} says {animal.name}: {animal.speak()}"
def Main(self):
Inherit_test_head.TDog("I am a pink dog")
# 创建一个Person实例
my_person = Person("Alice")
my_person.Main()
会报错,因为Main函数里面调用了一个类的实例
当类中没有特殊函数call时,类的实例不可被调用,当有了call函数,则在调用类的实例的时候会执行call 函数中的内容
因此,修改Inherit_test_head.py 函数
增加call函数如下,可以输出Inherit_test_head.TDog(“I am a pink dog”) 中传入的值
def __call__(self,value):
print("call back")
print(value)
class Animal:
def Init(self):
pass
def __init__(self, raiseError=False):
self.A="I'M A"
self.B="I'M B"
self._initPer()
print(self.A,self.B)
def _initPer(self):
self.p=CParameter("p")
self.p.k="PK"
print(self.p.k)
def __call__(self,value):
print("call back")
print(value)
def speak(self):
raise NotImplementedError("Subclass must implement abstract method")
class Dog(Animal):
def Header():
print("Enter hearder")
def speak(self):
return "Woof!"
class CParameter:
def __init__(self, name, nameUnique = None):
# Attention: because we changed __setattr__ it is
print("Enter Cparameter")
TDog=Dog()
执行结果如下: