Do you know what I just re-discovered? Class variables in Python are basically static by default. If you want instance variables, those must be declared in the constructor. I forgot about this design choice. I have to say, after using PHP for so long, I'm increasingly annoyed with Python. Type hinting feels bolted on, there's no public/private, you need decorators for abstract classes, support for multi-line f strings is shaky...

Another stupid thing about Python: type hints don't do anything at all! No, really, try it.

```
myInt: int = 5
myInt = "this is not an int"
```

It works just fine. I'm liking Python less and less as today goes on.

@alexhall That's why they're called hints/annotations. Python is not, and probably never will be, a statically typed language. The hints are there for external tools, or some future thing built into Python, to analyse your code for correctness. They're also quite useful for documentation purposes.
@jscholes I guess I'm used to how PHP does it. Hints are inforced, with implicit conversion where possible. If I have a function that accepts an int, and I pass it a whole number wrapped in quotes, PHP sees that it can convert that to the proper type with no data loss and it does so for me. If the data type can't be safely converted, it throws. PHP calls these hints, so I think I got it in my head that a robust type checking system would be involved when a language had hints.

@alexhall It all depends what you're used to and is best for your use case, I suppose. For me, languages or libraries that implicitly convert types are the devil's work.

If my code needs a number and gets passed a string, the call site is broken. Either that, or my code needs to explicitly support handling strings too, and not have some other actor implicitly, silently take care of it.

However, there are Python libraries that will do that sort of thing for you if you want them to, or just cut down on type checking boilerplate. Maybe look at Pydantic, attrs, and cattrs.

@alexhall Python is gaining some more interesting runtime-checkable type system stuff, though. For example, there are runtime-checkable protocols now, a bit like interfaces in other languages, where `isinstance` can check that an object fulfills an interface without being concerned about its actual type.
@jscholes It definitely all depends. Also, to clarify, I don't love implicit conversion. It's handy sometimes, but I prefer to be explicit. I'd just rather the language honor the type I assign, if I assign one. PHP and Python are both loosely typed, but if PHP gets type hints, it considers them. I appreciate that. There's a lot about PHP I still dislike, but I'm surprising myself with how much I'm increasingly annoyed at Python the more I use it for this one project.