Инициализация класса Python - PullRequest
       1

Инициализация класса Python

0 голосов
/ 18 сентября 2011

Я новичок в объектно-ориентированном дизайне.

Я пытаюсь включить функцию Python в мой init .(Функция работает, как я спрашивал ранее ).

Вот мой код:

import struct
import urllib2
import StringIO


class wallpaper:
    def __init__(self, url):
        self.url = url
        self.content_type = ''
        self.height = 0
        self.width = 0
        image = urllib2.urlopen(self.url)
        data = str(image.read(2))
        if  data.startswith('\377\330'):
            self.content_type = 'image/jpeg'
            jpeg = StringIO.StringIO(data)
            jpeg.read(2)
            b = jpeg.read(1)
            try:
                while (b and ord(b) != 0xDA):
                    while (ord(b) != 0xFF): b = jpeg.read(1)
                    while (ord(b) == 0xFF): b = jpeg.read(1)
                    if (ord(b) >= 0xC0 and ord(b) <= 0xC3):
                        jpeg.read(3)
                        h, w = struct.unpack(">HH", jpeg.read(4))
                        break
                    else:
                        jpeg.read(int(struct.unpack(">H", jpeg.read(2))[0])-2)
                        b = jpeg.read(1)
                    self.width = int(w)
                    self.height = int(h)
            except struct.error:
                pass
            except ValueError:
                pass


x = wallpaper('http://i.imgur.com/rapwX.jpg')
print x.url, "\t", x.content_type,"\t", x.height,"\t", x.width

Проблема в том, что я не могу инициализировать свойства высоты и ширины (ониравно 0).

Где проблема?

Редактировать:

Я нашел проблему, вот решение .Спасибо за ваши подсказки.

Еще один вопрос: является ли мой подход правильным в отношении правил ООП?Должен ли я вычислить ширину / высоту в init или создать другой метод (например, размер или около того)?

Ответы [ 3 ]

3 голосов
/ 18 сентября 2011

Вы только читаете 2 байта в data.

1 голос
/ 18 сентября 2011

Если это условие

ord(b) >= 0xC0 and ord(b) <= 0xC3

истинно на первой итерации внешнего while, вы выходите из цикла перед назначением self.width и self.height.Может быть, вы хотели сделать отступ для двух назначений на один уровень меньше, чем они есть в вашем коде?

1 голос
/ 18 сентября 2011

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

    except struct.error:
        pass
    except ValueError:
        pass

По крайней мере, вы должны напечатать сообщения об ошибках:

    except struct.error as exc:
        print str(exc)
    except ValueError as exc:
        print str(exc)

Таким образом, вы должны иметь возможностьотладить ваш код и, таким образом, решить вашу проблему.

Конечно, я предполагаю, что отступ в вашем реальном коде правильный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...