我的逻辑是这样的:
def A(val):
return {'a':val}
print(A(7)['a'])
是相同的
class A:
def __init__(self, val):
self.a = val
print(A(7).a)
很明显,这里有一些问题和不同之处:
除了这些小例子,字典==类(对我来说)。你同意我的观点吗?
发布于 2014-11-10 21:34:28
可以将对象o
视为包含以下内容的实体
在Python对象中,使用点表示法(o.var,o.foo())访问成员和方法。当然,您可以像前面描述的那样,通过字典来轻松地模拟:字典也是映射(参见第3点),您可以使用它来存储对象字段或方法。
因此,我要说的是,类构造是表示对象模式的一种更方便的语法。您也可以用字典模拟对象,它只会变得更详细。
创建“对象”的语法。这就是为什么(我认为)类更优秀的原因,因为使用函数创建类很快就会变得非常烦人。
与创建类的函数不同,我可以想象使用函数来创建对象(即特殊字典),这些对象对应于类构造函数。还请参阅您的示例:函数A()
是对应于类A
的__init__()
方法的构造函数。
遗产继承。
我认为,如果使用返回字典的构造函数对类建模,那么可以在子类构造函数中使用超类构造函数来建模继承。子类构造函数可以调用超类构造函数,然后用自己的定义扩展/重写生成的字典。
例如:
# Superclass A.
def A(val):
def toString(a):
return str(a['a'])
def printOut(a):
print(a['toString'](a))
return {'a': val, 'toString': toString, 'printOut': printOut}
# B is a subclass of A.
def B(val):
# Override method.
def toString(a):
return 'value = ' + str(a['a'])
r = A(val)
r['toString'] = toString
return r
总之,我不认为字典和课堂是一样的:
发布于 2014-11-10 22:27:22
你是对的。动态语言中的对象是从高级字典/映射对象演化而来的,在某些方面类似于这些对象。这对于基于原型的语言(如JavaScript )来说是非常正确的,对于基于类的语言(如Python和Ruby )也是如此。
然而,这个问题过于简单化。你问“有什么不同吗?”但很快就排除了不少非常重要的差异。像继承这样的功能(Python有一个精心设计的多继承系统,并提供广泛的元类支持)和dunder方法的特殊处理都不是小事。它们是定义语言的语义、操作和可扩展性的大量工作。
您可能希望列出Python类不同的其他方式,例如
obj.attr
)访问成员@property
)、类而不是实例方法(@classmethod
)或类相对正常函数(@staticmethod
)。我们可以在字典上列出更多类不同于单纯的“语法糖”的方法。而选择使用开槽的、非字典的实现应该能达成协议。但是,这样的上市错过了第一个问题:
类和对象可能在某种程度上只是幻想的字典,但它们的进化程度已经足够,它们完全变成了其他的东西。
类定义新的数据类型。在该语言的所有最新版本中-2.x前进,使用子类object
的“新样式对象”-用户定义的类在很大程度上也是等价的,并且与内置数据类型完全并行。您可以询问type(x)
和instance(x, (int, str, MyClass))
,与类和实例交互,就像使用内置数据类型及其值一样。这在大多数传统的静态语言中是不可能的,在这种语言中,您可能可以构建新的抽象数据类型,但它们永远无法与内置类型相媲美或具有灵活性。
完全暴露:还有一些剩余的差异,很大程度上是微妙的,主要是基于这样一个事实,即内置类型是在C中“在幕后”实现的,而不是Python对象。就本身而言。
但是,在很大程度上,类与字典的不同之处在于,它们贯穿于语言设计之中,并使它们及其实例与语言定义类型相提并论。在Python中,它们与映射对象的相似性显然是次要的。
https://softwareengineering.stackexchange.com/questions/262366
复制相似问题