动态添加到类

2024-05-08 21:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经创建了一个新类,我正在尝试动态地添加到该类中, 我已经创建了一个列表,我想在其中放置多个对象,然后我将在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

Tags: nameselfinitdefpolicymobilelevelstarttime
3条回答

默认情况下,可以将所有参数__init__设置为None

def __init__(self, Policy=None, Level=None, etc...):

将构造函数方法的位置参数转换为具有有用默认值的命名可选参数:

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

可以为类编写动态构造函数(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存储变量名。我使用了双下划线变量,因此无法从extend访问它。你知道吗
user = User()
print(user.__attrs)
Traceback (most recent call last):
    print(user.__attrs)
AttributeError: 'User' object has no attribute '__attrs'

是的,有其他方法可以访问双下划线变量,但没有人会这样做;)

  • 如果函数__str__不存在,则函数__repr__通过调用printstr返回string。你知道吗

你知道吗 现在测试一下

>>> 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

。它在JavaC#中工作,但在Python中不工作。函数def __init__(self, a, b, c)将被覆盖。类中只存在函数def __init__(self)。你知道吗

相关问题 更多 >

    热门问题