动态实现 __str__ 如果没有实现
Dynamically implement __str__ if not implemented
我正在尝试编写一个函数 strFix,它将 class 对象作为参数,并检查 class 是否具有 str( ) 方法,如果没有会自动添加一个,即在一行上打印所有成员变量,例如:打印三角形的边数、边列表和面积。
但是,在调用 strFix(triangle)
之后我得到了一个三角形对象,而不是打印它?
def constructor(self, arg):
self.no_of_sides = arg
def setSidesT(self, x, y, z):
self.x = x
self.y = y
self.z = z
self.listattr = [x, y, z]
def createSubClass(self):
self = type(
"Triangle", # subclass name
(Polygon,), # super class(es)
{
"listattr": [], # new attributes and functions/methods
"setSides": setSidesT,
"findArea": (lambda obj: (obj.x + obj.y + obj.z) / 2),
"getTriangleSides": (lambda x: print(x.listattr)),
},
)
return self
Polygon = type(
"Polygon",
(object,),
{
"no_of_sides": 0,
"__init__": constructor,
"getSides": (lambda obj: obj.no_of_sides),
},
)
def Tprinter(self):
return str(self.no_of_sides, self.getTriangleSides, self.findArea)
def strFix(self):
if not type(self).__dict__.get("__str__"):
setattr(self, "__str__", Tprinter)
triangle = createSubClass(Polygon)(3)
triangle.setSides(4, 5, 6)
triangle.getTriangleSides()
strFix(triangle)
print(triangle.findArea())
print(triangle)
你应该只使用一个 classbody,一个普通的 superclass 和一个默认的 __str__
- 同时这是正常的事情,并且做你想要。
就是说,您的 strFix
函数在 实例 上插入了一个 __str__
方法,那是行不通的 - 您必须设置 __str__
在 class 本身上。
而且,当 =
足够时,无需使用 setattr
:
def strFix(instance):
cls = instance.__class__
if "__str__" not in cls.__dict__:
cls.__str__ = Tprinter
我正在尝试编写一个函数 strFix,它将 class 对象作为参数,并检查 class 是否具有 str( ) 方法,如果没有会自动添加一个,即在一行上打印所有成员变量,例如:打印三角形的边数、边列表和面积。
但是,在调用 strFix(triangle)
之后我得到了一个三角形对象,而不是打印它?
def constructor(self, arg):
self.no_of_sides = arg
def setSidesT(self, x, y, z):
self.x = x
self.y = y
self.z = z
self.listattr = [x, y, z]
def createSubClass(self):
self = type(
"Triangle", # subclass name
(Polygon,), # super class(es)
{
"listattr": [], # new attributes and functions/methods
"setSides": setSidesT,
"findArea": (lambda obj: (obj.x + obj.y + obj.z) / 2),
"getTriangleSides": (lambda x: print(x.listattr)),
},
)
return self
Polygon = type(
"Polygon",
(object,),
{
"no_of_sides": 0,
"__init__": constructor,
"getSides": (lambda obj: obj.no_of_sides),
},
)
def Tprinter(self):
return str(self.no_of_sides, self.getTriangleSides, self.findArea)
def strFix(self):
if not type(self).__dict__.get("__str__"):
setattr(self, "__str__", Tprinter)
triangle = createSubClass(Polygon)(3)
triangle.setSides(4, 5, 6)
triangle.getTriangleSides()
strFix(triangle)
print(triangle.findArea())
print(triangle)
你应该只使用一个 classbody,一个普通的 superclass 和一个默认的 __str__
- 同时这是正常的事情,并且做你想要。
就是说,您的 strFix
函数在 实例 上插入了一个 __str__
方法,那是行不通的 - 您必须设置 __str__
在 class 本身上。
而且,当 =
足够时,无需使用 setattr
:
def strFix(instance):
cls = instance.__class__
if "__str__" not in cls.__dict__:
cls.__str__ = Tprinter