使用静态方法覆盖__str__来更改类字符串表示

时间:2017-03-27 22:21:36

标签: python static-methods

请注意:这是我试图为学校作业做的一些类似的小例子,因此某些解决方案无法改变。指出那些作品。

据我了解, str 可用于格式化打印时表示类的方式。

我打算覆盖 str 方法,以便:

>>>print(class_slim)
my name is... Slim Shady

>>>print(class_fat)
my name is... Fat Shady

以下是示例代码:

class MyClass:
    fname = ''
    lname = ''

    def __init__(self, fname='', lname=''):
        self.name = ""

    def __str__(self):
        return 'my name is... '+self.fname, self.lname

    @staticmethod
    def setname(first, last):
        return first, last


class_slim = MyClass.setname("Slim", "Shady")
print(class_slim)

class_fat = MyClass.setname("Fat", "Shady")
print(class_fat)

现在,我得到了这个结果:

>>>class_slim = MyClass.setname("Slim", "Shady")
>>>print(class_slim)
('Slim', 'Shady')

我被要求:

  • 使用静态方法(setname)来更改fname和lname,
  • 类的不同实例需要返回不同的字符串(我想输出“我的名字是...... Slim Shady”和“我的名字是...... Fat Shady”......

如果任何不可能或我所做的假设完全错误请告诉我,这可能是问题。

2 个答案:

答案 0 :(得分:0)

好的,这就是我最终要做的事情,新建一个类实例所需的静态方法,并将该实例返回到函数内置的父类 str

class MyClass:

    def __init__(self, first, last):
        self.fname = first
        self.lname = last

    def __str__(self):
        return 'my name is...'+self.fname+" "+self.lname

    if __name__ == '__main__':
        @staticmethod
        def read(first, last):
            newClass = MyClass(first,last)
            return newClass

class_slim = MyClass.read("Slim", "Shady")
print(class_slim)

class_fat = MyClass.read("Fat","Shady")
print(class_fat)

这是

的输出

“我的名字是...... Slim Shady”

“我的名字是... Fat Shady”

答案 1 :(得分:0)

您使用staticmethod拍摄自己的脚,没有静态方法,您可以设置类实例的属性,而无需重新初始化您的类的新实例。 (此操作可能很昂贵,具体取决于您的课程。)

如果没有任何更改,您可以在不使用setter方法的情况下更改实例的属性;

slim_ins = MyClass("Slim", "Jim")
print(slim_ins)
# My name is... SlimJim
slim_ins.lname = "Shady"
print(slim_ins)
# My name is... SlimShady

但这仅适用于slim_ins的{​​{1}} 实例这将影响MyClass的所有实例,因为fname和lname是类属性!实例和它们是(子)实例的类之间的区别是微妙但内在是Python中OOP的关键;与实例的属性和方法的交互只会影响实例,而与类的属性和方法的交互将影响该类及其任何子类的所有实例。

我相信你需要的是一个类工厂,类工厂的参数可以用来产生一个独特的类;

MyClass

静态方法永远不会在这里发挥作用。您可以在静态方法中实现类工厂并从对象中调用它(不要与其中一个实例混淆)但是您不需要携带类工厂您的每个实例,并且您不应该使用def my_class_factory(first_name, last_name): class MyClass(object): fname = first_name[:] lname = last_name[:] def __str__(self): return "My name is... "+fname+" "+lname 以外的方法实例化对象,因为这是__init__所做的。