Почему переводчик не сообщает об ошибке? - PullRequest
0 голосов
/ 28 апреля 2020
class A:
    name = 10  # this is a class variable

    def fun(self):
        print('this is a function')
        return name  # this is the return value, but same 'name'

name = A()
name.fun()
print(name.fun())
# operation result
this is a function
this is a function
<__main__.A object at 0x000001D95A894508>

Он может успешно работать, но не соответствует грамматическим логикам c, почему он («имя») не сообщает об ошибке?

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

У вас есть ошибка, которая маскируется тем фактом, что вы используете name в глобальном пространстве имен. Когда вы используете переменную в методе, python проверяет пространство имен метода, а затем возвращается к глобальному пространству имен. return name не видит локальный name, но, к счастью (неудача), в глобальном пространстве имен есть name, и это то, что возвращается. Если вы позже использовали это возвращаемое значение, вы обнаружите, что в нем есть экземпляр A.

Вместо этого используйте ссылку self.name. Python найдет self в пространстве имен метода и, увидев, что это пространство имен экземпляра объекта, сначала проверит пространство имен объекта, а затем вернется к пространству имен класса.

class A:
    name = 10  # this is a class variable

    def fun(self):
        print('this is a function')
        return self.name  # this is the return value, but same 'name'

foo = A()
name = foo.fun() 
# three references to the same object
print(name, A.name, foo.name)
0 голосов
/ 28 апреля 2020

Ваша fun функция действительна из-за того, что она ссылается на переменную name из глобальной области (если вы назовете объект класса A, который вы инициализировали с другим именем, ваш код сломается) .

Например - этот код не будет работать:

class A:
    name = 10  # this is a class variable

    def fun(self):
        print('this is a function')
        return name  # this is the return value, but same 'name'

object_a = A()
object_a.fun()

В вашей глобальной области действия name определяется как объект класса A таким образом, выполнение name.fun() будет выполнять функцию fun этого объекта.

Если вы хотите получить доступ к локальной переменной name, определенной в классе, вы можете попытаться запустить это :

name = A()
print(name.name) # output: 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...