初始化Python类
我刚接触面向对象设计。
我尝试把一个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里计算宽度和高度,还是应该创建一个其他的方法(比如叫size之类的)?
3 个回答
1
如果你只是忽视了错误,那就很难找到问题所在:
except struct.error:
pass
except ValueError:
pass
至少你应该打印出错误信息:
except struct.error as exc:
print str(exc)
except ValueError as exc:
print str(exc)
这样你就能调试你的代码,从而解决问题。
当然,我假设你实际代码中的缩进是正确的。
1
如果这个条件
ord(b) >= 0xC0 and ord(b) <= 0xC3
在外层的 while
循环第一次运行时为真,你就会在给 self.width
和 self.height
赋值之前跳出循环。也许你是想把这两个赋值的缩进减少一级,让它们在循环里面执行?
3
你只是在 data
中读取了2个字节的数据。