Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Variable Types in a class
#7
Other than dataclasses you don't see typing used much for instance variables. This is likely because instance variables are really just entries in a dictionary. Since instance variables are really just dictionary entries, you can add instance variables at any time, not just in the __init__ method. Even dataclass objects allow adding attributes. Using Yoriz' example:
from dataclasses import dataclass
 
@dataclass
class Node:
    value: float
    next: "Node" = None
    prev: "Node" = None

x = Node(5)
x.string = "Hello"
print(x, x.string)
Output:
Node(value=5, next=None, prev=None) Hello
"string" is an attribute of x. x might be the only Node in history to have a "string" attribute, making x not only different from other Note objects by having a unique ID and different instance variable values, but also by having an additional instance variable.

If you want to restrict class instances to only having variables that you define, you can also use Pydantic. Defining a class using pydantic looks very, very similar to defining a dataclass.
from pydantic import BaseModel
 
class Node(BaseModel):
    value: float
    prev: "Node" = None
    next: "Node" = None

x = Node(value=5)
x.string = "Hello"
Error:
ValueError: "Node" object has no field "string"
Instead of adding a "string" attribute to x we get a ValueError. BaseModel overrides __setattr__() to raise an exception instead of adding the "string":"Hello" to the object dictionary (x.__dict__).

Another way to get very similar behavior is using __slots__.
class Node():
    __slots__ = ("value", "prev", "next")
    value: float
    prev: "Node"
    next: "Node"

    def __init__(self, value:float, prev:"Node" = None, next:"Node" = None):
        self.value = value
        self.prev = prev
        self.next = next

x = Node(value=5)
x.string = "Hello"
Error:
AttributeError: 'Node' object has no attribute 'string'
Here we get an AttributeError, which I think is a better choice than a ValueError. The error is raised not because something overrode the normal __setattr__() behavior to prevent adding items to the object dictionary, but because classes that define __slots__ don't have an object dictionary at all. When a class uses __slots__, all instances of the class have the same attributes. The attributes can have different values, but you cannot add any new instance variables.
Reply


Messages In This Thread
Variable Types in a class - by nafshar - Oct-06-2022, 07:20 PM
RE: Variable Types in a class - by XavierPlatinum - Oct-06-2022, 07:31 PM
RE: Variable Types in a class - by nafshar - Oct-06-2022, 07:48 PM
RE: Variable Types in a class - by deanhystad - Oct-06-2022, 08:31 PM
RE: Variable Types in a class - by ndc85430 - Oct-06-2022, 08:33 PM
RE: Variable Types in a class - by Yoriz - Oct-06-2022, 09:21 PM
RE: Variable Types in a class - by deanhystad - Oct-07-2022, 03:39 AM
RE: Variable Types in a class - by nafshar - Oct-07-2022, 10:26 AM
RE: Variable Types in a class - by Yoriz - Oct-07-2022, 02:57 PM
RE: Variable Types in a class - by deanhystad - Oct-07-2022, 07:13 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  can Inner Class reference the Outer Class's static variable? raykuan 6 6,181 Jul-01-2022, 06:34 AM
Last Post: SharonDutton
  Distinguishing different types of class attributes Drone4four 4 2,210 Feb-21-2022, 06:34 PM
Last Post: deanhystad
  Calling a base class variable from an inherited class CompleteNewb 3 1,819 Jan-20-2022, 04:50 AM
Last Post: CompleteNewb
  Can we access instance variable of parent class in child class using inheritance akdube 3 14,108 Nov-13-2020, 03:43 AM
Last Post: SalsaBeanDip
  Class variable / instance variable ifigazsi 9 4,506 Jul-28-2020, 11:40 AM
Last Post: buran
  Assignment of non-existing class variable is accepted - Why? DrZ 6 4,423 Jul-13-2020, 03:53 PM
Last Post: deanhystad
  Limiting valid values for a variable in a class WJSwan 5 3,825 Jul-06-2020, 07:17 AM
Last Post: Gribouillis
  Newbie: Help with variable selection in a class Slack86 5 2,826 Apr-07-2020, 08:41 PM
Last Post: jefsummers
  Using variable from a class in another .py script keegan_010 4 3,154 Mar-25-2020, 07:47 AM
Last Post: keegan_010
  How to access class variable? instances vs class drSlump 5 3,473 Dec-11-2019, 06:26 PM
Last Post: Gribouillis

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020