请注意:这是我试图为学校作业做的一些类似的小例子,因此某些解决方案无法改变。指出那些作品。
据我了解, 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')
我被要求:
如果任何不可能或我所做的假设完全错误请告诉我,这可能是问题。
答案 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__
所做的。