Advertisement
Guest User

Untitled

a guest
Aug 24th, 2016
52
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.29 KB | None | 0 0
  1. class Rope:
  2. length = 30
  3. def get_info(self):
  4. print("n", "---"*8, "n", "class Rope, get_info(): ", "n",
  5. "Rope's length is %s meters" % self.length,
  6. "n", "---"*8, "n"
  7. )
  8.  
  9. class Knife:
  10. def cut_rope(self, length, a):
  11. print("Now we will cut %s meters off" % length)
  12. a.length -= length
  13.  
  14.  
  15. rope = Rope()
  16. knife = Knife()
  17.  
  18. rope.get_info()
  19. knife.cut_rope(12, rope)
  20. rope.get_info()
  21.  
  22.  
  23. C:UsersолегPython34classes>ex2.py
  24.  
  25. ------------------------
  26. class Rope, get_info():
  27. Rope's length is 30 meters
  28. ------------------------
  29.  
  30. Now we will cut 12 meters off
  31.  
  32. ------------------------
  33. class Rope, get_info():
  34. Rope's length is 18 meters
  35.  
  36. # coding=utf-8
  37.  
  38. class Rope:
  39. # зачем хардкодить длину верёвки? Лучше будем задавать её в конструкторе.
  40. def __init__(self, length):
  41. if length <= 0:
  42. raise ValueError('length should be > 0')
  43. self._length = length
  44.  
  45. # сработает с методом len()
  46. def __len__(self):
  47. return self._length
  48.  
  49. # а это сработает с str(), соответственно и с print
  50. def __str__(self):
  51. return "This rope's length is {0!s} meters".format(self._length)
  52.  
  53.  
  54. class Knife:
  55.  
  56. # Полиморфизм! Ножу всё равно, что резать. На выходе должно быть два того же.
  57. # Если нарезаемое нельзя инициировать только по длине, задаваемой числом, будет ошибка.
  58. def cut(self, object, length):
  59. _class = object.__class__
  60.  
  61. # по-хорошему, тут ещё должны быть проверки, что length не None и что число
  62. # и, конечно, что object не None
  63. if len(object) < length:
  64. raise ValueError('cut length exceeds available length')
  65. elif len(object) == length:
  66. # даже для одного объекта мы возвращаем список, чтобы всегда был перечислимый (iterable) результат
  67. return [_class(len(object))]
  68. else:
  69. return [_class(len(object) - length), _class(length)]
  70.  
  71.  
  72. rope = Rope(30)
  73. knife = Knife()
  74.  
  75. print rope
  76.  
  77. for r in knife.cut(rope, 20):
  78. print r
  79.  
  80. # -*- coding: UTF-8 -*-
  81.  
  82. class Rope(str):
  83. def __init__(self, s: str):
  84. self.len = len(self)
  85. self.str = self.__repr__()
  86. print(self)
  87.  
  88. def __str__(self):
  89. return "%s rope's length is %s meters" % (self.str, self.len)
  90.  
  91. def __getitem__(self, item: slice):
  92. return self.__class__(super().__getitem__(item))
  93.  
  94.  
  95. class Knife:
  96. allRope = []
  97.  
  98. def __init__(self, string: str, length: int):
  99. rope = Rope(string)
  100. print('{s} cut {}[{}] pos'.format(rope.len, length, s=rope.str))
  101.  
  102. if 0 < rope.len < length: raise IndexError
  103. for r in rope[:length], rope[length:]:
  104. self.allRope.append(r)
  105.  
  106.  
  107. if __name__ == '__main__':
  108. rope = '-qwertyuiop-'
  109. Knife(rope, 5)
  110. print(rope, {r: r.len for r in Knife.allRope})
  111.  
  112. '-qwertyuiop-' rope's length is 12 meters
  113. '-qwertyuiop-' cut 12[5] pos
  114. '-qwer' rope's length is 5 meters
  115. 'tyuiop-' rope's length is 7 meters
  116. -qwertyuiop- {'-qwer': 5, 'tyuiop-': 7}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement