为什么Python会在同一级别处理数据和功能?#34;不同?

时间:2015-11-15 17:20:51

标签: python class attributes

鉴于此课程:

class Person:
  lastName = ""
  firstName = ""

  def getFullName(self, lastName, firstName):
    self.instanceLevel_lastName = lastName
    self.instanceLevel_firstName = firstName

为什么Python选择将firstNamelastName视为类级别的attrs,将getFullName()视为实例级别的成员/方法,尽管它们是在&#34中定义的;同等级"?我默认认为,同等级别的玩家将以同样的方式对待"应该是所有实例级成员。

我意识到这不是一个编程问题,但它更多的是关于语言设计。我来自C ++背景,所以我对Python中的这种行为感到有些困惑。

3 个答案:

答案 0 :(得分:0)

class Person:
  def __init__(self):
      self.firstName = ""
      self.lastName = ""

  def getFullName(self):
    ...

将为您提供实例级属性。

答案 1 :(得分:0)

要获取静态方法,您需要使用@staticmethod装饰器。

class MyClass:
    classAttr = 4

    @staticmethod
    def static_foo():
        print("Static Shock!")

这很可能是因为python中很少需要静态方法,因为它们通常可以被模块中的顶级函数替换。

有关详细信息,请参阅此问题:Static methods in Python?

答案 2 :(得分:0)

事实上,Python并不将getFullName视为实例级成员,而不是示例中的lastNamefirstName。所有这些都是在类级别定义的,可以这样访问。

如果我稍微改变你的例子:

class Person:
  lastName = ""
  firstName = ""

  def getFullName(self):
    return("{} {}".format(self.firstName, self.lastName))

请注意,您可以通过课程访问所有这些:

>>> Person.firstName
''
>>> Person.getFullName
<function Person.getFullName at 0x104168c80>

您可以通过实例访问所有这些:

>>> p = Person()
>>> p.firstName
''
>>> p.getFullName
<bound method Person.getFullName of <__main__.Person object at 0x104173240>>

也就是说,它们都是类属性,您可以通过实例访问任何类属性。

现在,您可以在此处看到,您访问方法getFullName的方式确实会影响您获得的内容,因为Person.getFullName是一个函数(因为它self第一个参数)和p.getFullName是一个绑定方法(其中self已被绑定,因此它不会采用该参数):

>>> p = Person()
>>> Person.getFullName(p)
' '
>>> p.getFullName()
' '

同样,Person.firstName = "Bob"将设置类属性firstName,而p.firstName = "Bob"将设置实例属性firstName,而实例变量将在下次显示类变量时访问p.firstName

>>> Person.firstName = "Bob"
>>> p.firtName
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Person' object has no attribute 'firtName'
>>> Person.firstName = "Bob"
>>> p.firstName 
'Bob'
>>> p.firstName = "Joe"
>>> p.firstName
'Joe'
>>> Person.firstName
'Bob'