有没有办法将** kwargs添加到__str __()的对象签名?

时间:2016-06-03 14:15:37

标签: python string python-3.x signature kwargs

我希望能够更改@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); OnClickButtonListener(); } public void OnClickButtonListener() { button_lb1 = (Button) findViewById(R.id.bt_lubri); button_lb1.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } } ); button_lb2 = (Button) findViewById(R.id.bt_lubri2); button_lb2.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, ThirdActivity.class); startActivity(intent); } } ); button_lb3 = (Button) findViewById(R.id.bt_lubri3); button_lb3.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, FourthActivity.class); startActivity(intent); } } ); button_cf = (Button) findViewById(R.id.bt_combri); button_cf.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, FifthActivity.class); startActivity(intent); } } ); button_dp = (Button) findViewById(R.id.bt_dp); button_dp.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SixthActivity.class); startActivity(intent); } } ); button_tp= (Button) findViewById(R.id.bt_tp); button_tp.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, SeventhActivity.class); startActivity(intent); } } ); button_cal= (Button) findViewById(R.id.bt_cal); button_cal.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, EighthActivity.class); startActivity(intent); } } ); } 的输出,并希望为此添加__str__()

问题:似乎无法更改功能的签名。

例如:

**kwargs

输出:

#!/usr/bin/env python3

class my_printable_obj(object):

    def __init__(self, s):
        self.content = s

    def __str__(self, **kwargs):
        fancy = kwargs.get('fancy', '')
        return str(self.content) + fancy



M = my_printable_obj("Something to print")

print(str(M))
print(str(M, fancy=' + a fancy part'))

我注意到,尽管有TypeError消息,但python确实使用了$ ./test_script3str.py Something to print Traceback (most recent call last): File "./test_script3str.py", line 17, in <module> print(str(M, fancy=' + a fancy part')) TypeError: 'fancy' is an invalid keyword argument for this function (在my_printable_obj.__str__()的开头添加了print('here'),让我们可以轻松地观察它。)

是否有解决方案可以做到这一点,或者由于某种原因是不可能的?我是否应该更好地定义另一个函数,例如__str__()并使用into_str(self, **kwargs)代替M.into_str(fancy=' something more')

注意:写下这个:

__str__()

给出完全相同的错误。

2 个答案:

答案 0 :(得分:6)

您使用kwarg调用的函数是str (the inbuilt function)

str()会在您的对象上调用__str__方法。

也许您正在寻找的是__format__

>>> class MyPrintableObj(object):

    def __init__(self, s):
        self.content = s

    def __format__(self, formatstr):
        return str(self.content) + formatstr

>>> m = MyPrintableObj("Something to print")
>>> '{: a fancy string}'.format(m)
'Something to print a fancy string'

答案 1 :(得分:2)

内置strtype。当您执行str(custom_object)之类的操作时,str的构造函数会调用对象的__str__()方法。你不能在不覆盖它的情况下改变类型的签名(这不是一个好主意)。

class _str(str):
    def __new__(cls, *args, **kwargs):
        if args:
            obj = args[0]
            if hasattr(obj, '__str__'):
                return obj.__str__(**kwargs)
        return str.__new__(cls, *args, **kwargs)
str = _str

是的,显然不是一个好主意,但这是用法:

class Example:
    def __str__(self, **kwargs):
        return 'kwargs: {}'.format(kwargs)

print str(Example(), arg1=1, arg2=2)
# kwargs: {'arg1': 1, 'arg2': 2}

在自定义对象上显式调用__str__方法可能更好一点,尽管它是一种“dunder”方法。