首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:获取python类没有属性

Python:获取python类没有属性
EN

Stack Overflow用户
提问于 2017-12-19 02:36:12
回答 3查看 4.1K关注 0票数 0

运行下面的代码时出现下面的属性错误。使用self访问类成员函数时,仍然会出现错误。

代码语言:javascript
复制
class A:
    def __init__(self):
        self.a=1
    def f1(self):
        self.b=2
        def f2(self):
            self.c=3
            print(self.a,self.b,self.c)
        self.f2()

model = A()
model.f1()

错误:

代码语言:javascript
复制
AttributeError: 'A' object has no attribute 'f2'
EN

回答 3

Stack Overflow用户

发布于 2017-12-19 04:08:01

A没有属性f2,但它有一个调用函数f2的属性f1f2不是实例属性

在这种情况下,c不再是实例属性,也不是数据属性,它现在只是一个局部变量。这可能是你想要的,也可能不是。

代码语言:javascript
复制
class D:
    def __init__(self):
        self.a = 1

    def f1(self):
        # Instance attribute declared outside of __init__
        self.b = 2

        def f2():
            c = 3
            print(self.a, self.b, c)
        f2()

根据开发环境的不同,您可能会收到关于在__init__函数外部声明实例属性的警告,也可能不会收到。您没有必要以这种方式声明它们,但是,它提高了可读性。

代码语言:javascript
复制
class B:
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3

    def f1(self):
        def f2():
            print(self.a, self.b, self.c)
        f2()

下一个代码块在it 所说的关于代码意图的中稍微更明确一些。

代码语言:javascript
复制
class A:
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3

    def f1(self):
        def f2():
            return '{} {} {}'.format(self.a, self.b, self.c)
        return f2()

您可能希望使用self参数的方法属性来调用f2(),在这种情况下:

代码语言:javascript
复制
class A2:
    def __init__(self):
        self.a = 1
        self.b = 2
        self.c = 3

    def f2(self):
        print(self.a, self.b, self.c)

    def f1(self):
        """Do something that requires calling the self.f2()
        print function.
        """
        self.f2()
票数 3
EN

Stack Overflow用户

发布于 2017-12-19 02:38:24

调用嵌套函数时不需要self,也不需要包含在函数签名中:

代码语言:javascript
复制
class A:
   def __init__(self):
     self.a=1
   def f1(self):
     self.b=2
     def f2():
        c=3
        print(self.a,self.b, c)
     f2()

model = A()
model.f1()

输出:

代码语言:javascript
复制
1, 2, 3
票数 1
EN

Stack Overflow用户

发布于 2017-12-19 03:39:50

我不清楚你是否真的需要在一个方法中定义一个函数来调用它。

因此,您的代码可以很容易地如下所示:

代码语言:javascript
复制
class A:
    def __init__(self):
        self.a = 1

    def f1(self):
        self.b = 2
        self.f2()

    def f2(self):
        self.c = 3
        print(self.a, self.b, self.c)

model = A()
model.f1()

输出:

代码语言:javascript
复制
1 2 3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47874453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档