我已经创建了一个新类,我试图动态添加到该类, 我创建了一个列表,我希望将多个对象放入其中,然后我将在Django中迭代该列表(这是正确的做事方式吗?)
但我收到以下错误
TypeError: __init__() takes exactly 9 arguments (1 given)
我知道错误意味着什么,我只是想知道如何创建我的对象的新实例并轻松地添加它?
### create User Object
class User:
def __init__(self, Policy, Level, StartDate, EndDate, StartTime, EndTime, Name, Mobile):
self.Policy = Policy
self.Level = Level
self.StartDate = StartDate
self.EndDate = EndDate
self.StartTime = StartTime
self.EndTime = EndTime
self.Name = Name
self.Mobile = Mobile
def __init__(self):
pass
### Get all the Polices ###
lstOnCall = []
for objPolicy in objPolicyData['escalation_policies']:
strPolicyName = objPolicy['name']
if strPolicyName.lower().find('test') == -1:
for objOnCall in objPolicy['on_call']:
objUser = User()
objUser.Policy = strPolicyName
objUser.Level = objOnCall['level']
objUser.StartDate = getDate(objOnCall['start'])
objUser.EndDate = getDate(objOnCall['end'])
objUser.StartTime = getTime(objOnCall['start'])
objUser.EndTime = getTime(objOnCall['end'])
objUser = objOnCall['user']
objUser.Name = objUser['name']
objUser.Mobile = getUserMobile(objUser['id'])
lstOnCall.append(objUser)
print lstOnCall
更新: 添加以下作品,我只需要知道如何打印项目?
def __init__(self):
pass
以下
for item in lstOnCall:
print item()
返回
print item()
AttributeError: User instance has no __call__ method
答案 0 :(得分:3)
您可以为您的班级编写动态构造函数(def __init__
):
class User(object):
__attrs = ['Policy', 'Level', 'StartDate', 'EndDate', 'StartTime',
'EndTime', 'Name', 'Mobile']
def __init__(self, **kwargs):
for attr in self.__attrs:
setattr(self, attr, kwargs.get(attr, None))
def __repr__(self):
return ', '.join(
['%s: %r' % (attr, getattr(self, attr)) for attr in self.__attrs])
__attrs
存储变量名称。我使用双下划线变量,因此它无法从扩展中获取。user = User()
print(user.__attrs)
Traceback (most recent call last):
print(user.__attrs)
AttributeError: 'User' object has no attribute '__attrs'
是的,还有其他方法可以访问双下划线变量,但没有人会这样做;)
__repr__
不存在,函数string
会通过调用print
或str
来返回__str__
。 现在测试一下
>>> u1 = User(Name='user1')
>>> u2 = User(Name='user2', Policy=1, Level=3)
>>> print(u1)
Policy: None, Level: None, StartDate: None, EndDate: None, StartTime: None, EndTime: None, Name: 'user1', Mobile: None
>>> print(u2)
Policy: 1, Level: 3, StartDate: None, EndDate: None, StartTime: None, EndTime: None, Name: 'user2', Mobile: None
如果您使用我的代码,您可以打印案例中的项目:
for item in lstOnCall:
print item
您的代码的其他问题
Python中没有定义Function overloading
。您可以在python中使用相同名称定义多功能。但它没有任何意义。只有最后定义仍保留在class
/ module
中。之前的定义将被覆盖。你正在做什么
class User:
def __init__(self, a, b, c):
...
def __init__(self):
pass
错误。它适用于 Java 或 C#,但不适用于 Python 。函数def __init__(self, a, b, c)
将被覆盖。只有您的班级中存在函数def __init__(self)
。
答案 1 :(得分:1)
试试这个,
if (![_fileManager fileExistsAtPath:_diskCachePath]) {
[_fileManager createDirectoryAtPath:_diskCachePath withIntermediateDirectories:YES attributes:nil error:NULL];
}
答案 2 :(得分:1)
默认情况下,您可以将所有参数设置为__init__
为None
:
def __init__(self, Policy=None, Level=None, etc...):
答案 3 :(得分:1)
使用有用的默认值将构造函数方法的位置参数转换为命名的可选参数:
class User:
def __init__(self, Policy=Null, Level=1,
StartDate="2016-01-01", EndDate="2016-12-31",
StartTime="00:00", EndTime="23:59",
Name="UNKNOWN", Mobile=""):
self.Policy = Policy
self.Level = Level
self.StartDate = StartDate
self.EndDate = EndDate
self.StartTime = StartTime
self.EndTime = EndTime
self.Name = Name
self.Mobile = Mobile