我是面向对象设计的新手。
我尝试将python函数合并到我的 init 中。 (功能有效,I asked earlier)。
这是我的代码:
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)。
问题出在哪里?
编辑:
我发现了问题,这里是solution。谢谢你的提示。
还有一个问题:就OOP规则而言,我的方法是否恰当?我应该在 init 中计算宽度/高度还是创建其他方法(例如,尺寸等)?
答案 0 :(得分:3)
您只需将2个字节读入data
。
答案 1 :(得分:1)
如果您只是忽略异常,就很难确定问题:
except struct.error:
pass
except ValueError:
pass
至少你应该打印错误信息:
except struct.error as exc:
print str(exc)
except ValueError as exc:
print str(exc)
这样您就可以调试代码,从而解决问题。
当然,我认为缩进在您的实际代码中是正确的。
答案 2 :(得分:1)
如果这种情况
ord(b) >= 0xC0 and ord(b) <= 0xC3
在外部while
的第一次迭代中为真,您在分配self.width
和self.height
之前就会脱离循环。也许你打算将这两个作业缩进一个级别,比你的代码中的级别少一些?