假设我有一个这样的课程
class Employee:
pass
我为Employee
创建了两个对象,如下所示
john = Employee()
rob = Employee()
..并创建实例变量
john.age = 12
rob.age = '15'
编译器同时接受并打印年龄(约翰的int
年龄和抢劫年龄string
)。这怎么合乎逻辑?每个对象中具有不同类型的相同数据属性。
感谢。
答案 0 :(得分:7)
请务必了解这一基本原则:Python中的,变量没有类型。 值具有类型。这是Python的本质,与Lisp和Javascript类似,是一种动态类型语言,但与C,C ++和Java不同。
>>> foo = 5 # foo now holds a value of type int
>>> foo = 'hello' # foo now holds a value of type string
以下是维基百科在Python中entry on typing的摘录:
Python使用duck typing并输入 对象但无类型的变量名称。 不检查类型约束 编译时间;相反,操作 对象可能会失败,表示该对象 给定的对象不合适 类型。尽管是动态类型, Python是强类型的,禁止 没有明确定义的操作 (例如,在a中添加一个数字 字符串)而不是默默地 试图理解他们。
如果你想学习Python,请阅读更多关于这个主题的内容(特别是Duck Typing是什么)。
P.S。此问题与对象的属性完全正交。属性只是Python中的其他“变量”,它们也可以保存值。这些值可以是不同的类型。
答案 1 :(得分:2)
因为说rob.age
您不创建具有特定类型的类范围数据属性;您只是创建一个实例本地的,特定于实例的属性,该属性引用一个具体的实体,即字符串'15'
。要创建一个类范围的属性,您必须在Employee.age = …
块中说age
或设置class Employee:
。通过将属性设置为描述符,我想您可以在每次设置时检查其类型并将其限制为整数或字符串或其他任何内容;但一般来说,类属性或实例属性只是对象的名称,所有Python关心的是.age
命名对象。
请注意,无论如何,Python无法猜出你的意思。如果你说john.age
是12,你似乎希望Python猜测所有其他.age
属性也应该是数字。但为什么Python不应该更进一步,并猜测它们是整数 - 或者更好的是,它们甚至是整数?我真的不认为在任何情况下Python从单个赋值推断到某种猜测是否合理,以及如何在类的所有其他实例中处理该属性。
答案 2 :(得分:1)
从根本上说,当你使用动态类型语言时,你会得到什么。
类型是在运行时确定的,而非声明。
它有优点和缺点,但我相信在大多数开发环境中它的优点都大于它的缺点。
(这是Ruby,Python,PHP等所做的)
答案 3 :(得分:1)
Python的编译器不关心绑定到属性/名称的值的类型,也不关心它; Python的动态特性意味着重要的类型检查(通常实际上是属性检查)是在运行时完成的。
答案 4 :(得分:0)
术语“variable”在Python中是混乱的。