2

我正在使用 Python 3 进行开发,我有一个带有我的类 Color 参数的方法,但是当我尝试使用一个方法时:

def __init__(self, name, color=Color.Color("none"), style="solid", width="1px"):
    self.__name = name
    self.__style = style
    self.__width = width
    if color.get_name() == "none":
        color.color_by_name('Black')

这是错误:

File ................, line 10, in __init__
if color.get_name() == "none":
AttributeError: 'str' object has no attribute 'get_name'
4

3 回答 3

2

听起来您想接受 Color 对象或字符串。您可以鸭式或显式检查:

鸭型:

def __init__(self, name, color=Color.Color("Black"), style="solid", width="1px"):
    # Note: Changed default to 'Black', since there is no color 'none'
    # This makes it a lot simpler.
    self.__name = name
    self.__style = style
    self.__width = width
    try: 
        color.get_name()
    except AttributeError:
        color = Color.Color(color)

显式检查:

def __init__(self, name, color=Color.Color("Black"), style="solid", width="1px"):
    self.__name = name
    self.__style = style
    self.__width = width
    if not isinstance(color, Color.Color):
        color = Color.Color(color)

无论哪种方式都有效;哪一个更容易取决于您的检查有多明确(即您是否有其他类(如 color 需要单独的 isinstance 检查?是否有一个方便的鸭式检查可以捕获所有故障)。

于 2013-10-23T18:19:09.500 回答
0

可能是由于传递了错误的数据而导致的此错误。

为避免这种情况,您可以检查传递的参数。

如果您的代码依赖于确切的类实例您应该检查传递的参数是否是此类的实例:

assert isinstance(color, Color), "color should be an instance of Color"

如果您不关心实例类但想确保该实例具有属性 get_color 检查实例是否具有属性

if not hasattr(color, 'get_color'):
    color=Color.Color("none")
if color.get_name() == "none":
    color.color_by_name('Black')
于 2013-10-23T16:34:23.817 回答
0

您使用错误的哨兵值时None非常适合。尝试:

def __init__(self, name, color=None, style="solid", width="1px"):
    self.__name = name
    self.__style = style
    self.__width = width
    if color is None:
        self.color = "Black"
    else
        self.color = color

但是类属性之间存在混淆,只有通过显示完整的类才能消除这种混淆。奇怪的是有一个类有一个自己类型的实例作为属性。

__width除非你真的需要,否则你不应该使用双下划线属性名称。private当 Python确实不提供私有存储类时,许多 Python 新手认为“这是模拟成员的方式”。

于 2013-10-23T16:37:43.517 回答