No puedo entender el concepto de operador de punto

Hola chicos, estoy realmente confundido sobre el funcionamiento del operador de puntos … El código que he probado …

class Name: class x: def __init__(self,y): self.y = y def __init__(self): pass some = Name() some.xy = 'foo' print some.xy 

Cuando ejecuto este código, sale con éxito foo .

Pero cuando probé el código

 class Name: class x: def __init__(self,y,z): self.y = y self.z = z def __init__(self): pass some = Name() some.xyz = 'foo' print some.xyz 

me sale un error … ¿cómo puedo usarlo como some.xyz y obtener la salida como foo ?? ..

Cualquier ayuda útil sería apreciada … Gracias

No está claro por qué esperaba que el segundo código funcionara. El primer código es malo, ya que mezcla clases e instancias: some son una instancia del Name de la clase ; some.x es una clase , y también un atributo de clase de Name . Si creas otra instancia de Name , compartirá los mismos atributos en x . En su lugar, considere esto:

 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.xyz # 'foo' 

El resultado se ve como:

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

No puede intentar acceder a cadenas de atributos arbitrarios y esperar que funcionen; debe definir los atributos que debería tener su objeto (hasta que __getattr__ , por ejemplo, a __getattr__ , pero no nos preocupemos por eso ahora). No puede agregar atributos arbitrarios a, por ejemplo, cadenas o None (por lo que ahora no puede establecer some.xyzfoo = 'bar' ), aunque puede hacerlo en sus propias clases (por lo que podría establecer some.xybar = 'baz' ). Sin embargo, no puede hacer, por ejemplo, some.xyfoo.bar = 'baz' , porque some.xyfoo no existe (todavía).