如何解决用相同的值初始化类的几个属性的最佳方法是什么?
考虑一个必须在其初始值设定项中包含多个属性的类,并且这些属性必须全部使用相同的值进行初始化。这些属性被命名为attrX
,其中X
由1到20之间的整数组成:
class MyClass(object):
def __init__(self):
self.attr1 = some_value
self.attr2 = some_value
...
self.attr20 = some_value
此代码很快就会变得很丑陋。话虽这么说,如果应该像这样初始化大量属性,那么最好的方法是什么?请记住,20个属性只是一个示例(可能比这个数字高出很多)。
解决方法
选项1:
将值作为字典传递。
class MyClass(object):
def __init__(self,dic):
self.attributes = dic
def method(self):
self.attributes['attr1'] = 'sabich'
same_value = 'common value'
# dic = { 'attr1' : same_value,'attr2' : same_value }
ATTRIBUTES_NUMBER = 50
for i in range(ATTRIBUTES_NUMBER):
dic[f'attr{i}'] = same_value
c = MyClass(dic)
选项2:
直接将属性设置为对象。
class MyClass(object):
def __init__(self,same_value,attributes_names):
for attr_name in attributes_names:
setattr(self,attr_name,same_value)
def method(self):
self.attr1 = 'sabich'
N = 50
same_value = 'common value'
attributes_names = [ f'attr{i}' for i in range(N)]
c = MyClass(same_value,attributes_names)
,
用for循环创建字典会更好吗?
例如:
import { FCM } from 'cordova-plugin-fcm-with-dependecy-updated/ionic/ngx';
constructor(private fcm: FCM){}
private async pushSetup() {
await this.platform.ready();
console.log('FCM SETUP INIT');
if (!this.platform.is('cordova')) {
return;
}
console.log('IN CORDOVA');
this.hasPermission = await this.fcm.requestPushPermission();
console.log('CHECK hasPermission:',this.hasPermission);
this.token = await this.fcm.getToken();
console.log('CHECK getToken: ' + this.token);
console.log('ON NOTIFICATION SUBSCRIBE');
this.fcm
.onTokenRefresh()
.subscribe((newToken) => console.log('NEW TOKEN:',newToken));
this.fcm
.onNotification()
.subscribe((payload: object) => console.log('ON NOTIFICATION:',payload));
}
然后您可以使用self.attributes [index]来简单地访问或编辑值。例如,您也可以使用self.attributes ['attribute_'+ str(i)]来分配唯一的名称而不是数字。
,要回答您的问题而不问其他任何问题,可以使用setattr
:
default_value = 10
class MyClass(object):
def __init__(self):
for i in range(1,21):
setattr(self,f'attr{i}',default_value)
代码示例:
obj = MyClass()
print(dir(obj))
print(f'{obj.attr1=}')
print(f'{obj.attr20=}')
输出:
['__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','attr1','attr10','attr11','attr12','attr13','attr14','attr15','attr16','attr17','attr18','attr19','attr2','attr20','attr3','attr4','attr5','attr6','attr7','attr8','attr9']
obj.attr1=10
obj.attr20=10
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。