"__new__ VS __init__" In Python Tutorial (Simplified Explantion)
In this video we're going to be looking at the difference between _new_ and _init_ in Python! We'll cover how they work and how we can use them.
▶ Become job-ready with Python:
www.indently.io
▶ Follow me on Instagram:
/ indentlyreels
00:00 Intro
00:20 Getting started
00:49 Private attribute
00:58 _new_
02:53 _init_
03:03 Running the example
04:27 Quick summary
05:02 Another example
08.28 Summing it up
Пікірлер: 40
I think it’s worth noting that in the singleton pattern example, “init” will *always* get called after “new” if an instance is returned in “new”, meaning that if constructor gets called twice and you are setting up some attributes in “init”, those will get overridden in the next call, but object instance will be still technically the same in the example of the video.
Good video. I have almost never used __new__ and have done my singletons through metaclasses where a Singleton metaclass maintains a dict of instances, but this did actually teach me some things I wasn't entirely sure of about __new__.
Concise and clear as always I'm finding. Thanks for some excellent explanations.
new day new information... This is the first time i see the __new__ keyword in Python. Thanks Indently, subscribed
Been lovong your channel. Lots of neat insight!
Very helpful.
Thank you
thanks bro
This is what I think is happening from the Vehicle example. If a vehicle has either 2 or 4 wheels, they become instances of the Vehicle class that has been initialized beforehand. But in a rare occurrence where a vehicle does NOT have 2 or 4 wheels, a new class is automatically created using __new__, but you will also need to initialize this new class with the necessary parameters/arguments. In a nutshell, you use __new__ as some kind of a "backup" class in case the instance does not meet the originalclass parameters.
I been thinking this dude lately does videos just to get something out with little to no value, yet this one is quite interesting new thing that I didn't know of, and might be helpfull in some occasions, I would definetly try it out...hope it's now a feature of python 3.11 cause I am using 9 and 10
@Indently
Жыл бұрын
I appreciate you subscribing to someone who posts videos with little or no value 😂
@Sinke_100
Жыл бұрын
@@Indently you love Python and you have nice voice, I guess good enough to stay subscribed 🙂 keep it up man, no hate here
Great video. Do you have any video explaining why ___ is used to initialize variables? I did it in C#, but I don't know if it's the same thing.
The thing I found out is that you can annotate stated types in __new__ and dynamicly annotate in __init__ with TypeVars for Generics as an example. Just to not mess up with code.
Can someone tell me how was Super() invoked even though Connection isn't extending any parent class?
Usually only used in library codes, avoid using __new__ at work. unless you have no other choice. Your IDE will get confused by this as it does not execute __new__ for u and it just assumes constructing an instance will return a new instance. Not to mention people that use your class would get so confused and could make mistake.
3:56 if the object doesn't have __eq__ the code performs de is operator
which editor are you using ?
@woster4055
Жыл бұрын
It is pycharm with beta UI
So in the last example, when we create mb = Vehicle(2), mb is an object of the class Motorbike and no longer Vehicle?
@naturfagstoff
Жыл бұрын
No. It is both, mb is a Vehicle of 'type' Motorbike.
@ron与数学
Жыл бұрын
@@naturfagstoff MaxCa is right. It is no longer a Vehicle. Please see my other comment for details.
@ron与数学
Жыл бұрын
It's strange that my comment didn't show up. I will just copy it and rephrase it here. 1. The example here loses the point that the Motorcycle and Car should inherit from the Vehicle class. I know that Indently is trying to show the power of __new__() but I think it is worth pointing out that if someone wrote code this way, the code better be refactored. 2. A function/method should only do what its name says, nothing more. The __new__() method is responsible for creating the instance. However, by returning `Motorcycle()` directly. It implicitly called the Motorcycle's __init__() method. I refactored the code a little bit. class Vehicle: def __new__(cls, wheels): if wheels == 4: return super(Vehicle, cls).__new__(Car) elif wheels == 2: return super(Vehicle, cls).__new__(Motorcycle) else: pass def __init__(self, wheels): self.wheels = wheels class Car(Vehicle): def __new__(cls, *args, **kwargs): print("Creating Car") return super(Car, cls).__new__(cls) def __init__(self, wheels): print("Initializing Car with 4 wheels") super(Car, self).__init__(wheels) class Motorcycle(Vehicle): def __new__(cls, *args, **kwargs): print("Creating Motorcycle") return super(Motorcycle, cls).__new__(cls) def __init__(self, wheels): print("Initializing Motorcycle with 2 wheels") super(Motorcycle, self).__init__(wheels)
@Indently
Жыл бұрын
I completely forgot to inherit from Vehicle, you're right!
@naturfagstoff
Жыл бұрын
Apologize for my kneejerk reaction there, @maxca. You are completely right. @hollyandprosper explains it in detail. Even if the Vechilcle class is called upon, and thus should be creating an object of type Vehicle, it does not do that, but instead creates Motorbike if 2 vheels, and a Car if 4 vheels. Strangely enough, the Vechicle class only creates an instance of it's own type as an exception, that is if the number of wheels is NOT 2 or 4. And as @Indently admints, he completely forgot to inherit from Vehicle when defining those two other classes, Motorbike and Car. I was too quick there,and maybe made the same mistake as @Indently, in assuming the code followed usual design principles for classes and objects, but the code actually does not do that. So excellent and very important point.
how on earth do you get pycharm to look that good
Unfortunately, this did not really explain to me what __ new__ actually does. It was more of a complicated Singleton Implementation
@rogumann838
Жыл бұрын
That's what the video was, as he stated in the first 15 seconds
@mking1982098
Жыл бұрын
new is performed before the instance of the object is created, whereas init runs after the object is already created. This means you can use the __new__ method to do things like set conditions and rules for the creation of an instance. e.g., you can do value error handling etc. before actually creating instance, whereas with init any error handling breaks etc. may stop certain attributes of the class from being set and whatnot but the instance will still be created.
And that's how you implement a Singleton using Python.
Great video, but it's pretty much a complete copy of mCoding. In his video he has the exact same connection example, and a similar example to vehicles.
@Indently
Жыл бұрын
If that's what you think, looks like mCoding copied it from the same website that I got the examples from 😂
@edhyjoxenbyl1409
Жыл бұрын
@@Indently The thing is mCoding writes it own examples
@Indently
Жыл бұрын
So do I, but I'm not hiding that I take inspiration from examples that are shown on python.org, or other websites. The original example for the vehicle was actually inspired by an example that was meant for an Animal class, where instead of wheels, they used legs.
what is this a mcoding clone 😂😂
@Indently
Жыл бұрын
Not at all, mCoding is an incredibly talented programmer and teacher. I make videos because I love Python :)