我希望能够更改@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__()
给出完全相同的错误。
答案 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)
内置str
是type
。当您执行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”方法。