AssertionError:<bound method =“” comment.created_at =“” of =“” <solution.comment =“” object =“” at =“” 0x7f3db6beba58 =“” >>不是<class'datetime.datetime的实例'=“”>

时间:2018-11-21 04:58:15

标签: python-3.x

我是python的新手,正在尝试学习OOP。我有一个我一直试图解决的模拟测验。到目前为止,已经能够通过5次测试

这是挑战

用户分为3种类型,普通用户,版主和管理员。普通用户只能创建新评论,并编辑自己的评论。主持人具有删除评论(删除巨魔)的附加功能,而管理员具有编辑或删除任何评论的功能。 用户可以登录和注销,我们会跟踪他们上次登录的时间 评论

属性封装

所有类都不应有可公开访问的字段 您应该确保至少“隐藏”必填字段,例如,使用_name而不是_name。或者,随时使用更好的解决方案作为额外的功劳。 提供了基于方法的API。这些必须按原样完成。 允许使用其他方法,尽管请记住将只读属性保持为只读。 实例化

应该使用属性实例化类(如提供),以创建具有已分配值的实例。 用户/主持人/管理员默认值: 应标记为未登录 最后一次登录at属性应该返回None 注释默认值: 在实例化时应为创建的at属性设置当前时间戳 答复为是可选的,如果未提供,则应为None。 继承与访问控制

用户 用户可以登录和注销。 登录时,设置last_logged_in_at时间戳。注销时请勿修改此时间戳记 用户只能编辑自己的评论 用户无法删除任何评论 主持人是用户 主持人只能编辑自己的评论 主持人可以删除任何评论 管理员既是用户又是主持人 管理员可以编辑任何评论 管理员可以删除任何评论 组成

评论包含对创建它的用户(作者)的引用 注释(可选)包含对另一个注释的引用(replied_to) 转换为字符串(to_string)时,使用以下格式: 没有回复: 邮件+“ by” + author.name 回复: 邮件+“ by” + author.name +“(回复为” + repliedTo.author.name +“)”

这是我的解决方法

import datetime
class user:

  def __init__(self, name, lastloggedIn = None):
    self.name = name
    self.loggedIn = False
    self.lastloggedIn = None

  def name(self):
    return self.name

  def name(self, value):
    self.name = value    

  def is_logged_in(self):
    return self.loggedIn

  def last_logged_in_at(self):
    return self.lastloggedIn

  def log_in(self):
    self.loggedIn = True
    self.lastloggedIn = datetime.datetime.utcnow()


  def log_out(self):
    self.loggedIn = False

  def can_edit(self, comment):
    if comment.author.name == self.name:
      return True
    else:
      return False

  def can_delete(self, comment):
    return False

#   def to_string(self):
#       pass

class moderator(user):
  def __init__(self, name):
    user.__init__(self, name)

  def can_delete(self, comment):
    return True



class admin(moderator):

  def __init__(self, name):
    moderator.__init__(self, name)

  def can_edit(self, comment):
    return True    


class comment:
  def __init__(self, author, message, replied_to = None, createdAt = None):
    self.createdAt = datetime.datetime.now()
    self.author = author
    self.message = message
    self.replied_to = replied_to

  def author(self):
    return self._author

  def author(self, value):
    self.author = value

  def message(self):
    return self.message

  def message(self, value):
      self.message = value

  def created_at(self):
      return self.createdAt

  def replied_to(self):
      return self.replied_to

  def replied_to(self, value):
      self.replied_to = value

  def to_string(self):
      if self.replied_to == None:
          return self.replied_to + " by " + self.author.name




import unittest

user1 = user('User 1')
mod = moderator('Moderator')

class Test(unittest.TestCase):
  def test_instantiation(self):
    self.assertEqual(user1.name,'User 1', 'User name is set correctly')
    user1.name = 'User 1 Updated'
    self.assertEqual(user1.name,'User 1 Updated', 'User name can be updated')
    self.assertIsInstance(mod, user, 'Moderator is a user')

我遇到两个主要错误。 last_logged_in方法应返回None,并且datetime.datetime.now()似乎无法正常工作

AssertionError: <bound method comment.created_at of <solution.comment object at 0x7fd5a21d0668>> is not an instance of <class 'datetime.datetime'>

AssertionError: <bound method user.last_logged_in_at of <[35 chars]ba8>> != None : Last logged in date is not set by default

1 个答案:

答案 0 :(得分:0)

让我们从第一个错误开始:

AssertionError: <bound method comment.created_at of <solution.comment object at 0x7fd5a21d0668>> is not an instance of <class 'datetime.datetime'>

IT表示您正在传递 datetime实例。让我们检查一下:

>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2018, 11, 21, 10, 28, 26, 996940) # this is datetime instance

您可以做的就是将其转换为 string 并传递给它:

>>> datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
'2018-11-21 06:51:22'

赞:

class comment:
  def __init__(self, author, message, replied_to = None, createdAt = None):
    self.createdAt = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")

第二个错误:

AssertionError: <bound method user.last_logged_in_at of <[35 chars]ba8>> != None : Last logged in date is not set by default

您未设置 lastloggedIn

 def __init__(self, name, lastloggedIn = None):
    self.name = name
    self.loggedIn = False
    self.lastloggedIn = lastloggedIn

同样在这里您要传递一个实例:

>>> datetime.datetime.utcnow()
datetime.datetime(2018, 11, 21, 6, 46, 25, 248409)

更改它以返回字符串而不是实例:

 def log_in(self):
    self.loggedIn = True
    self.lastloggedIn = datetime.datetime.utcnow().strftime("%Y-%m-%d %H:%M:%S")