【发布时间】:2013-02-15 23:07:40
【问题描述】:
我刚开始接触 Python,这是一个关于类的逻辑和实现的非常普遍的问题。我为这个问题的基本层面道歉,但希望它对其他人也有用。这里有一些上下文可以更清楚地说明:
上下文
我想创建一个代表图像的类。此图像包括 3 个波段(R、G、B,与 3 个不同的文件相关联)和一些元数据(一个文件,其中包含 3 个波段文件的文件路径和其他信息,如相机、地理位置等)。
按照我的思路,Image类应该包含一个Metadata类型的属性和三个Band类型的属性。
类元数据应该有读取和返回各种信息的方法
类波段应该有对每个栅格波段进行分析和处理的方法。但是,这些方法可能需要访问元数据中包含的信息。
我的代码
这就是我要做的:
class Metadata:
def __init__(self, meta_file_path):
self.Path = meta_file_path
def ReadBandPath(self,band_number):
[...]
def ReadLocation(self):
[...]
def ReadCameraInfo(self):
[...]
def GetSomeOtherInfo(self):
[...]
class Band:
def __init__(self,Metadata, band_number):
self.Meta = Metadata
self.Number = band_number
self.Path = self.Meta.ReadBandPath(self.Number)
def DoSomething(self):
self.Meta.GetSomeOtherInfo()
[...]
class Image:
def __init__(self, meta_file_path)
self.Meta = Metadata(meta_file_path)
self.Band1 = Band(self.Meta, 1)
self.Band2 = Band(self.Meta, 2)
self.Band3 = Band(self.Meta, 3)
def SaveAsPng(dest_file):
[...]
我的问题
我的方式对我来说似乎有点多余,更重要的是它似乎是“静态的”。看起来如果我在创建 Image.BandN 之后更新 Image.Meta 中的一些信息,那么 Image.BandN.Meta 不会同时更新,对吧?
- 我是否正确设置和实施了问题?
- 以动态方式将元数据属性传递给 Band 对象的最聪明的方法是什么?
【问题讨论】:
-
首先,“类属性”通常意味着类上的属性,而不是类的每个实例上的属性。只是“属性”通常就足够了;当您必须避免歧义时,请尝试“实例属性”或“类实例属性”。
-
第二,用与类相同的样式命名属性会让人读起来很困惑,谈论变化更让人困惑。如果你关注PEP 8,我可以说
image.meta,你会假设我在谈论一个实例image,或者类Image。但如果你不这样做,我必须特意说“image.meta,其中image是Image实例。 -
我明白了,谢谢@abarnert 的提示!
标签: python class attributes