Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法理解点运算符的概念_Python - Fatal编程技术网

Python 无法理解点运算符的概念

Python 无法理解点运算符的概念,python,Python,嘿,伙计们,我真的对点运算符的工作感到困惑..我试过的代码 class Name: class x: def __init__(self,y): self.y = y def __init__(self): pass some = Name() some.x.y = 'foo' print some.x.y 当我运行此代码时,它成功地输出foo 但是当我尝试代码时 class Name: class x:

嘿,伙计们,我真的对点运算符的工作感到困惑..我试过的代码

class Name:
    class x:
        def __init__(self,y):
            self.y = y
    def __init__(self):
        pass

some = Name()
some.x.y = 'foo'
print some.x.y
当我运行此代码时,它成功地输出
foo

但是当我尝试代码时

class Name:
    class x:
        def __init__(self,y,z):
            self.y = y
            self.z = z
    def __init__(self):
        pass

some = Name()
some.x.y.z = 'foo'
print some.x.y.z
我得到一个错误..如何使用like
some.x.y.z
并将输出作为
foo


任何有用的帮助都将不胜感激。谢谢。

不清楚您为什么希望第二个代码能够工作。第一个代码很糟糕,因为它混淆了类和实例:
some
是类的一个实例
Name
some.x
是一个类,也是
Name
的类属性。如果创建另一个
Name
实例,它将在
x
上共享相同的属性。相反,考虑一下:

class Name(object):
    def __init__(self, x=None,
                 y=None, z=None):
        self.x = x
        self.y = y
        self.z = z

y = Name(z='foo')
x = Name(y=y)
some = Name(x=x)

##some = Name(x=Name(y=Name(z='foo'))) # one-line equivalent

print some.x.y.z # 'foo'
结果如下:

 - some: Name
   - x: Name
     - x: None
     - y: Name
       - x: None
       - y: None
       - z: 'foo'
     - z: None
   - y: None
   - z: None

您不能试图访问任意属性链
a.b.c.d
,并期望它们正常工作;您必须定义对象应该具有的属性(直到您进入例如
\uuu getattr\uuuu
,但现在我们不必担心)。您不能将任意属性添加到例如字符串或
None
(因此您现在不能设置
some.x.y.z.foo='bar'
),尽管您可以将其添加到您自己的类中(因此您可以设置
some.x.y.bar='baz'
)。但是你不能这样做,例如
some.x.y.foo.bar='baz'
,因为
some.x.y.foo
还不存在。

你是说
self.x.z
?你可以使用
some.x.y
some.x.z
。但是
z
不在
y
内,那么为什么您希望
一些.x.y.z
可以工作呢?@Barmar您可以将其作为答案发布吗请注意,嵌套类的
\uuuu init\uuuu
从未被调用,因为您从未实例化该类。当您设置``some.x.y`时,您正在
some.x
上设置一个class属性。从某种意义上说,这并不重要,因为
x
本身就是一个类变量,但它表明您并不真正理解代码在做什么。你想在这里完成什么?@user3843420:为什么你想做一些.x.y.z?与其说语法,不如说你能描述一下你想做的事情的含义吗?这可能是我见过的最高比率
quality(答案)/quality(问题)
SO,恭喜你:)