Уведомления

Группа в Telegram: @pythonsu

#1 Июль 17, 2014 02:21:09

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

знакомлюсь с ООП
по заданию нужно добавить метод resize
вылетает ошибка в чем проблема, не могу понять…

вот полный код если вдруг нужно
http://pastebin.com/ZpZbdwLj

Офлайн

#2 Июль 17, 2014 03:44:59

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

>>> class A:
...     
...     x = 1
...     
...     @property
...     def f(self):
...         return self.x
...     
... #    @f.setter
... #    def f(self, value):
... #        self.x = value
...     
...     @f.deleter
...     def f(self):
...         self.x = None
... 
>>> a = A()
>>> a.f = 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute
>>>

Добавь setter для свойства width.



Отредактировано py.user.next (Июль 17, 2014 03:45:41)

Офлайн

#3 Июль 17, 2014 10:30:50

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

могли бы вы пожалуйста дать не только ответ, но и прояснить что к чему? так как я хочу понять

Офлайн

#4 Июль 17, 2014 10:44:34

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

и я совсем не понял как сделать то что вы написали…

Офлайн

#5 Июль 17, 2014 11:34:02

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

разобрался, забыл ‘__’ поставить
self.__width

получается хотел присвоить что то методу self.width, а не переменной

Отредактировано simple_user (Июль 17, 2014 11:36:14)

Офлайн

#6 Июль 17, 2014 13:04:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

simple_user
но и прояснить что к чему? так как я хочу понять

Свойство объекта.

simple_user
разобрался, забыл ‘__’ поставить

Это неправильно. Оно там стоит, чтобы скрыть атрибут, поэтому к нему нельзя обращаться.

simple_user
и я совсем не понял как сделать то что вы написали

        @property
        def width(self):
            return self.__width
 
        @width.setter
        def width(self, value):
            self.__width = value

Пример:
>>> class A:
...     def __init__(self):
...         self.__x = 1
...     
...     @property
...     def x(self):
...         return self.__x
...     
...     @x.setter
...     def x(self, value):
...         self.__x = value
...     
...     @x.deleter
...     def x(self):
...         self.__x = None
... 
>>> a = A()
>>> a.x
1
>>> a.x = 2
>>> a.x
2
>>> del a.x
>>> a.x
>>> 
>>>



Отредактировано py.user.next (Июль 17, 2014 13:11:53)

Офлайн

#7 Июль 17, 2014 14:00:10

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

теперь я немного улавливаю суть декораторов, пространство имен, благодарю
но

self.__x = value
ведь вы же сделали так же само по сути, только я не использовал декоратор, так как этот метод специально создан для изменения свойств объекта

Офлайн

#8 Июль 17, 2014 22:26:10

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

simple_user
ведь вы же сделали так же само по сути, только я не использовал декоратор

Если в объекте есть поле, начинающееся с _, то оно не попадает в help. Если в объекте есть поле, начинающееся с __, то его не видно снаружи.

>>> class A:
...     def m(self):
...         pass
...     
...     def _m(self):
...         pass
...     
...     def __m(self):
...         pass
... 
>>> a = A()
>>> a.m()
>>> a._m()
>>> a.__m()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute '__m'
>>> 
>>> help(a)
>>>

Help on A in module __main__ object:

class A(builtins.object)
| Methods defined here:
|
| m(self)
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)

В питоне имена, включающие __ по краям (по обоим или с левого), предназачены для внутреннего использования.

>>> class A:
...     __x = 1
...     def m(self):
...         self.__x = 2
...     def p(self):
...         return self.__x
... 
>>> a = A()
>>> a.m()
>>> a.p()
2
>>> a.__x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'A' object has no attribute '__x'
>>>

Выдержка из pep8:
In addition, the following special forms using leading or trailing underscores are recognized (these can generally be combined with any case convention):

_single_leading_underscore: weak "internal use" indicator. E.g. from M import * does not import objects whose name starts with an underscore.

single_trailing_underscore_: used by convention to avoid conflicts with Python keyword, e.g.

Tkinter.Toplevel(master, class_='ClassName')

__double_leading_underscore: when naming a class attribute, invokes name mangling (inside class FooBar, __boo becomes _FooBar__boo; see below).

__double_leading_and_trailing_underscore__: "magic" objects or attributes that live in user-controlled namespaces. E.g. __init__, __import__ or __file__. Never invent such names; only use them as documented.



Отредактировано py.user.next (Июль 17, 2014 22:31:12)

Офлайн

#9 Июль 17, 2014 23:49:09

simple_user
Зарегистрирован: 2014-07-06
Сообщения: 60
Репутация: +  2  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

благодарю, но это я уже понял
я все использовал внутри класа
вот тот метод, уже работающий
найди 10 отличий)
как и говорил просто забыл добавить двойное подчеркивание

def resize(self,width=None,height=None):
		if (width==None) and (height==None):
			return False
		colors=set()
		if width < self.width:
			for j in range(width,self.width):
				for i in range(self.height):
					colors.add(self[j,i])
		if height < self.height:
			for j in range(width,self.height):
				for i in range(self.width):
					colors.add(self[i,j])
		self.__colors = self.__colors - colors
		self.__width = width if width != None else self.__width
		self.__heiht = height if height != None else self.__height
		return True
по ходу мы друг друга не правильно поняли просто

Офлайн

#10 Июль 18, 2014 10:15:35

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

пробую разобратся с ООП

simple_user
я все использовал внутри класа

Это я не заметил. Если это картинка, то setter'а не должно быть для width.
Подчёркивания нужны только там, где происходит запись (потому что нет setter'а). И None на равенство не принято проверять, используют is/is not.

simple_user
self.__width = width if width != None else self.__width

self.__width = width if width is not None else self.width



Отредактировано py.user.next (Июль 18, 2014 10:15:51)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version