鉴于此课程:
class Person:
lastName = ""
firstName = ""
def getFullName(self, lastName, firstName):
self.instanceLevel_lastName = lastName
self.instanceLevel_firstName = firstName
为什么Python选择将firstName
和lastName
视为类级别的attrs,将getFullName()
视为实例级别的成员/方法,尽管它们是在&#34中定义的;同等级"?我默认认为,同等级别的玩家将以同样的方式对待"应该是所有实例级成员。
我意识到这不是一个编程问题,但它更多的是关于语言设计。我来自C ++背景,所以我对Python中的这种行为感到有些困惑。
答案 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)
getFullName
视为实例级成员,而不是示例中的lastName
和firstName
。所有这些都是在类级别定义的,可以这样访问。
如果我稍微改变你的例子:
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'