Forum >> Programmazione Python >> Scripting >> Attributi di classe predefiniti e non mutabili

Pagina: 1

Ciao a tutti spero di essere nella sezione giusta, premetto che sono un neofita di python, sto studiando utilizzo python 3.4, sono arrivato alle classi e non sono riuscito a capire se è fattibile e se si come creare una classe con degli attributi precostituiti e che non sia possibile aggiungerne altri, cerco di spiegarmi meglio:
class MyClass:
    def __init__(self,a,b):
        self.a = a
        self.b = b

Il mio scopo è quello di avere come attributi delle varie istanze solo "a e b" e che una chiamata del tipo
test = MyClass(1,2)

test.name='prova'

mi dia un errore o non prenda affatto in carico l'attributo name.
Grazie



--- Ultima modifica di vinny74 in data 2016-11-01 12:29:52 ---
Credo che sia un comportamento non evitabile, a quanto mi risulta solo gli oggetti derivanti da classi "primitive" del linguaggio (list, str ecc) sono immutabili.
>>> a = list()
>>> type(a)
<class 'list'>
>>> a.pippo = 9
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'list' object has no attribute 'pippo'
Ma qualsiasi altra cosa definita dall'utente, anche facente parte di librerie terze, è modificabile (anzi, su questo si basa il monkeypatching, cioè "attaccare" nuove informazioni ad oggetti... che come dice il nome non rappresenta propriamente un buono stile di programmazione):
>>> import tkinter
>>> a = tkinter.Tk()
>>> a.pippo = 9
>>> a.pippo
9
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
Ciao a tutti spero di essere nella sezione giusta, premetto che sono un neofita di python, sto studiando utilizzo python 3.4, sono arrivato alle classi e non sono riuscito a capire se è fattibile e se si come creare una classe con degli attributi precostituiti e che non sia possibile aggiungerne altri,
snip
Il mio scopo è quello di avere come attributi delle varie istanze solo "a e b" e che una chiamata del tipo
test = MyClass(1,2)
test.name='prova'
mi dia un errore o non prenda affatto in carico l'attributo name.
>>> from collections import namedtuple
>>> MyClass = namedtuple('MyClass', 'a b')
>>> test = MyClass(1, 2)
>>> test
MyClass(a=1, b=2)
>>> test.name = 'prova'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'name'
https://docs.python.org/3/library/collections.html#collections.namedtuple

Ciao,




--- Ultima modifica di ㎝ in data 2016-11-01 20:39:11 ---
THE 🍺-WARE LICENSE (Revision ㊷):
<㎝🐌🐍.🇮🇹> wrote this post. As long as you retain this notice you
can do whatever you want with this stuff. If we meet some day, and you
think this stuff is worth it, you can buy me a 🍺 in return. -- ㎝
Ciao a tutti spero di essere nella sezione giusta, premetto che sono un neofita di python, sto studiando utilizzo python 3.4, sono arrivato alle classi e non sono riuscito a capire se è fattibile e se si come creare una classe con degli attributi precostituiti e che non sia possibile aggiungerne altri,
snip
Il mio scopo è quello di avere come attributi delle varie istanze solo "a e b" e che una chiamata del tipo
test = MyClass(1,2)
test.name='prova'
mi dia un errore o non prenda affatto in carico l'attributo name.
>>> from collections import namedtuple
>>> MyClass = namedtuple('MyClass', 'a b')
>>> test = MyClass(1, 2)
>>> test
MyClass(a=1, b=2)
>>> test.name = 'prova'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'name'
https://docs.python.org/3/library/collections.html#collections.namedtuple

Ciao,


Grazie provo con questa e faccio sapere


--- Ultima modifica di ㎝ in data 2016-11-01 20:39:11 ---


Pagina: 1



Esegui il login per scrivere una risposta.