Object Oriented Programming (OOP) in Python

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
[Music] hey welcome everybody my name is caleb curry and this video is going to be about object-oriented programming using python now if you've never seen anything from me here's my strategy teach the concept junk up here and then we go hands-on coding through what we talked about this allows you just to have a better understanding of what and why you're going to be typing before you just start copying code so i think it'll make learning a little bit more fun hopefully and also object-oriented programming is more of an approach or a paradigm of programming so if you learn the principles in this video you'll be able to apply these to other programming languages as well which will help you be overall a better software developer so let's not waste any time let's just get started so object oriented programming helps us represent things in our code what exactly do i mean well one of the challenges with programming is how do we represent data in our code if you're just working with very simple data this is easy you can use primitive data types and collections so for example if you just had to store the value 5 hey it's easy it's just a number if you need to store a string no problem and heck you can be wild you could even store multiple things together in a collection such as this and this would be a list in python so pretty simple data very simple to represent in our code just using simple variable types now what if you want to represent something a little bit more complex there's various ways to do this you could use json or xml you could use just numerous collections or you could use object oriented programming and that's what we're talking about in this video and another positive side effect of object-oriented programming is it allows us to represent data as a one-to-one relationship to business problems so for example if you wanted to create software to represent customers you can make customers in your code and i'll show you what i mean here in a second so the two big things in object-oriented programming are classes and objects classes represent something such as a customer and then objects are specific examples of that so let's go through an example here if we want to write software to work with customers we could create a customer class and then give it attributes such as the customer name or let's say you had some kind of subscription website or something you could have the membership type so this is an example of a class by creating our own classes we can group things in logical units customers in this case and then we can instantiate very fancy word this class into what are known as objects so now instead of having these general attributes we give it specific values so for example caleb and my membership type oh you better believe it's going to be gold premium you know and then we could have another object on here such as brad and we could give him like i don't know bronze so these are both objects and that is the very first thing you need to understand with object oriented programming we basically define a structure in what's known as a class and then we use that class to create objects so this is an object and this is another object and this is very ideal when you're going to have a common structure across numerous things you know every single customer is going to have a name and a membership type so that's the very first thing you create classes you create the attributes and then you give them specific values by creating objects alright so here we are with a completely blank python file so hopefully you can get to this point if not be sure to just check out some basic python videos because i don't want to distract from the point which is creating classes so here's what we're going to do we're going to say class and then give us some name which is usually what we're trying to describe such as a customer and by convention i'll use a capital letter now after the class you can put a colon and then everything after that is indented however many spaces you're using with your code so i got four spaces here now within this class is where we define our attributes so we're going to define the customer's name and the customer's membership type and everything else but before we get into that we need to create a special method and we're going to get in a method soon but for now just copy this code it's going to be def which is used to define a method and it has the exact name underscore underscore init underscore underscore and then put parentheses and a colon so what in the world did i just tell you to do well basically any time we create a customer this function is going to be invoked so any of the code that we want to execute every time a customer is created we put it in this indentation inside of the init method now this can often be known as a constructor or an initializer basically the function invoked when a customer is created so inside of the parentheses we can put anything we need for a customer to exist so the very first thing and this is just required for it to work you put the word self self is the equivalent to this inside of java or c sharp and sometimes in javascript basically self refers to whatever customer we're creating then what we do is we put any other attributes for this customer so for example we can have the customer's name and we can also have the customers membership type and any other attributes you want to define you can put here and then inside of this method we basically take these and assign them to that customer so we say self.name is assigned name and self.membership type is assigned membership type so it seems like there's some redundancy here but let's just talk about it when we say name by itself we're referring to this parameter and this function call claire come on i'm guest posting seriously all right it's been 27 years any time we have name by itself we refer to this parameter anytime we put name qualified with self we are referring to whatever customers being created so that's a lot of jargon so let's just see this in action and just to prove that everything's working we're going to say print customer created all right it doesn't necessarily prove everything is working but we can at least confirm that this method is being invoked so outside of the class here's what we do we create a variable we can just call it c for customer and then we say customer with parentheses and that is how we create a new customer but you can see we actually have some required parameters here so we need to pass those in so we can say caleb and gold so all of the stuff we were just describing we just did that we created a customer with the name caleb and the membership type of gold and we can print this we can say c dot name and we can say c dot membership type okay so let's run this and see what happens well let's first talk about what happens very first thing this method is going to be hit because we're creating a new customer here it's going to print customer created and then it's going to print the customer's name and the membership type hit run customer created and the name is caleb the membership type is gold all right so this is pretty much the framework you need to follow for any of the classes you're going to create if you want to create another object we can do that here we could say c2 and we create a new customer and this one's going to be brad and it's going to be bronze and we can also print c2 so we can say c2.name and c2 dot membership type run this and the very first one is caleb gold and then brad bronze now typically you're not going to have print statements inside of the init method so i just wanted to show you guys that so we're going to get rid of that we usually just like to keep this method as thin as possible its sole purpose is to basically take these arguments we pass in and assign them to the object which is going to be referred to in this method itself so when we create this person self talks about this object c and when we create this person down here self refers to this object c2 so the first time name is caleb the second time name is brad now obviously if you're going to have thousands and thousands of customers we probably aren't just going to have variables to store this information so instead you can have lists or any other data structure full of these so let's just go through an example with a list we could have customers and immediately we could take c and c2 that would work but then we still have these variables and it's still not the most scalable solution so i'm going to be teaching you how to create customers inline so here's how we do that we would basically take this code here cut it paste it right here take this code here cut it and paste it right here now all of this code we can just get rid of it and i'm gonna make a new line just to make this a little bit more readable all right so now we have a list of customers so we can grab that first customer's name by saying customers index 0 which will grab this one here then we say dot name and we get caleb you can do the same thing with the membership type or we can increment this one to grab the next customer brad alright so this is your basic class and how to create a few objects this is going to be the foundation for the rest of the object oriented programming stuff so make sure you have at least a pretty good understanding of what's going on here now again this is just something special you got to do this is an example of a method basically a function defined within a class and that's going to automatically be invoked but we can create our own methods that we can invoke ourselves and we're going to get into that now methods are one of the most useful things to give our classes and objects a little bit more functionality so now we're moving on to the section on methods so if the attributes provide the data and the values that we need to store about a customer then the methods provide the functionality what customers can do or what we can do with customers now the very first method you were exposed to was this underscore underscore init and this is just one of those methods where you just have to do it it's part of python's object-oriented programming and pretty much any time you see double underscores that is a method that already exists that we can actually override and create our own functionality so we created our own version of this init method that did things what did it do well it actually assigned a value to the name and the membership and this method the init method you'll often hear it known as the initializer or what you might probably hear more often because it correlates better with other programming languages is the constructor so a constructor it's just a method a section of code that is executed whenever we create a new customer inside of python the way we create a new customer is in our code we just say customer and have parentheses a lot of other programming languages this will actually be prefixed with the new keyword although that is not how we do it inside of python but if you're coming from like java or c sharp you'll probably see that new keyword a lot so the other thing is when we define this init method we put a couple of things in here the very first one was self and that is going to be put inside of any method we create to work with individual customers so we put self and then anything extra we want to add about customers so we have the name and the membership type yeah i think this is actually membership underscore type all right so this is what it looks like now now these here when we define these variables inside of some method we're creating these are known as parameters so hopefully you have some experience with just creating functions and this is not all brand new to you the parameters are the variables attached to the method we're creating now what about arguments arguments is another word that's often thrown around in exchange for parameters but they're technically different so when we create a customer we assign values to these parameters and those are passed in here so we have the value caleb and let's just say the value gold so these here are known as arguments so it's basically which side of the process are you on if you're in the definition side where we define the outline for the method they're known as parameters if we're actually applying specific values to these variables they're known as arguments so parameters definition arguments invocation we're not wanting to talk about overriding methods here because i'm tired of talking about stuff that already exists i want to create some of our own stuff so what if we wanted to create a method to actually do something with a customer let's say we wanted to create a method to upgrade the the members membership status so it might look like this upgrade membership first parameter in here is always going to be that self keyword whenever we're talking about methods to work with the customers and then anything else maybe the new membership so we could say new membership so we could define all the code what this does inside of our code and the way we would invoke this is we would take some customer in this case we have this c variable that's referring to a customer and we would say dot upgrade membership now as for the arguments the self is always implicit you never have to pass anything in for that so skip it the new membership we could put something like bronze and then as for the actual functionality what does this method do i mean that's ultimately up to you but as an example it could basically figure out what to charge the person because you know i'm downgrading my membership so maybe i need to get a refund and then it could basically invoke our our billing system to do that and return whether it worked or not so that's another thing with methods they can return a value so for example the upgrade membership might return the value negative one if it didn't work or it might return zero if it did work so zero tends to be like it it worked fine negative one is often it broke or any other number could mean something but if you have had experience with like c plus plus or c you'll often see something like return zero this basically means it worked but anyways the point here is not necessarily what this method does but more so that you can create methods to work with individual customers the way you do it is you define it inside of the class and you put this self word here the actual code for this method probably looks something like this so we're going to have a colon and then we would have maybe some api call and assuming that was successful we could say self dot membership type is now assigned the value new membership like so all right so that was this bunch of junk to say that hey we can create our own functions and put them inside of classes to call them methods so let's get some hands-on experience with this now so here we have the most basic customer class and we have one method in here the init method and this is where we define the attributes we want attached to each of our customers now inside of python it is a little dynamic in that we can add attributes after the fact so as an example i can say customers index one to grab this customer here and we can say something like verified and we could set this to some value like false and this is something we can use later on in print and there you go so python is more dynamic than a language like c sharp or java because you can add attributes on the fly it's more like javascript in that nature however it is best to put any data that you expect customers to have inside of this init method so it is considered best practice to have that there so let's go ahead and put this back to how it was we will get rid of this verified line because we're not going to need that and we're just going to print the name so beyond this init method we can create other methods and just do that below here so for example the one we talked about was i forget the exact type i think was upgrade membership or let's just do update memberships because you know maybe we could use it to downgrade the membership as well and we're going to have self in there and then we could have the new membership that we want to change it to so the most basic thing we're going to do is just say self dot membership type and change it to the new membership and we can just check to see if this works let's go ahead and print the membership and invoke this by saying customers index 1 dot update membership and pass in actually we'll pass in gold it's going to put bronze there but it's already bronze so we'll stick to upgrading this to gold and then after the fact we're going to do is we're going to print the membership type and just confirm that it was changed so let's run this all right we have an issue we have to print the membership type sorry so run this we start with bronze this method gets invoked on the customer and then the membership is gold now this method as is is kind of pointless because you can actually change attributes directly so instead of doing update membership you could just say membership type and assign it the value gold this works just the same way and we don't even need this method anymore you can just get rid of it however if you need to do custom functionality which is a little hard to see in our very simple application but here are some examples of custom functionality you could invoke an api you could update a database you could charge the customer you can calculate costs you can conquer the world and pretty much anything else so anytime you need some kind of functionality like this the appropriate place to do that is within a method so the easiest way to simulate something like this is to just print and we'll just say calculating costs just to simulate some math there and charging the customer so we'll leave that as that there and now you can see that functionality because if we invoke this method update membership pass in a value you can see that it actually shows up down here in the console now i wanted to take a second just to talk about this self here anytime you want these methods to appear on a customer then you put that self keyword there so you could create a method such as read customer and leave off the self well this is not going to be invocable on any individual customer so let me just write here print and we can just imagine reading customer from db well if we try to invoke this we say something like customers we'll just grab that first customer in that list and then we say read customer run this it says take zero positional arguments but one was given what in the world does that mean well when we invoke a method like so on an object a customer object the instance itself is implicitly passed so that's what gets assigned to this self variable here so when we don't have that there it's basically saying yo you're passing something but there's nothing to apply it to it's not working so that's what this type error here means so what would you do with this method instead well this is something that would be used if you want a method to describe customers in general but not any specific customer so for example if we're just reading a customer from the database that's not tied to caleb that has nothing to do with caleb so here's what we would do instead we would just invoke it on the customer class like so and run it now here it says reading customer from db this method is often known as static methods so basically methods that are not attached to any individual object but instead are invoked on the class itself so here's an example from some other code that i wrote basically it's this method parse camera it does not have self in the parameter list and this is the code that i used to basically read some data from a text file and parse it into information and it ultimately returned a new camera object so although we're not going into a complex example where we implement something like this i was hoping that just by showing you an example without self you would have a better understanding of self and as a result have a better understanding of your own true self but enough of this talk about self let's get back to methods the only other thing i wanted to talk about was first let's just get rid of this read customer we're not going to need that there are a couple of other methods we can override that are definitely useful so the very first one you should know about is str and this is also going to take self and this is going to be invoked anytime we try to convert a customer to a string so we created this method and now let's try to invoke it how do we invoke it well instead of printing customers.membership type let's just print that individual customer and now what happens when we run this it says returned non-string so anytime we override this string method we actually need to return a string so we can say return and in here we could say self dot name plus a space plus self dot membership type running this now we can look through our code here any time this is executed it says converting to string which is basically hitting this line here and then it prints the person's name and their membership type at once which is very very convenient if for example you did not have this method here let's just comment this out for a sec when we printed an entire customer so we printed this customer right here what it would do is it would just give us a memory address and say the type which is useful i'm not going to say it's not useful however oftentimes we want to get the actual data and not just the location of the data so that is why we would override the string method and we can also get rid of this print here i was just showing you guys that for simplicity so now we can very easily see our customers just by printing them here so what a useful line of code might be would be to print all of our customers so let's go up here into our class and we're going to define a new method we'll just say print all customers and this is not going to have self however i will take a list of customers and we can say for customer in customers print customer so you can see oftentimes we'll put methods in here that are somewhat related to customers just for organization's sake and we don't need to put that self in the parameter list so now inside of our code we can create a list of customers so what we'll do is just say customer the class with capital c there dot print all customers and we'll pass in our customers list we defined right here like so and running this we get all of the information for all of our customers another useful method is the equals method so we could say def underscore underscore eq underscore underscore self and this is also going to have another parameter we're just going to call it other which is going to refer to what we are comparing our customer to so this will see if two customers are equal so what we can do is we can say if self.name is equal to other dot name and self dot membership type is equal to other dot membership type then what we're going to do is we're going to return true otherwise we're going to return false so pretty much if you're comparing two customers and they have the same name and they have the same membership type then you can assume they're the same customer now that's a pretty weak comparison but you can do whatever kind of comparison in here you want you know maybe you compare addresses maybe you compare social security cards maybe you compare dna sequences whatever you got to do you can pretty much compare whatever you want here just remember that any of these attributes are comparing you're probably going to need to define them up in the init method so let's just test this out a couple of times we have two customers down here and what we can do is we can print to see if they are equal so we'll say print customers index 0 is equal to customers index 1. running this we get false which is to be expected because they're two totally different people but if we change their name let's go with caleb and gold again we run this now we get true if we did not override the equals method then by default it compares by memory location so we'll just comment this out for a second and even though logically it seems like these are the same customers we run this and we get false and the reason that is is you can actually see it if you pass these to id and just put a comma here run forgot a parenthesis there run this and you can see that these are two different objects in memory so by default it looks at these ids sees that they're different and says yuck nope these are not the same people so we're going to say false for the equals however we can override that behavior with this equals method and running this we still have different ids but if we were to compare the data like so getting rid of this id here we run this and we get true and the last method i want to discuss with you right now is the hash method i've done stuff on hash if you need to know the juicy details however for now i'd recommend just saying underscore underscore hash is none this isn't going to really ruin any functionality or break anything the only thing is that you're not going to be able to use your customers inside of hashable data structures so i mean you can use them in the value side of a dictionary but not trying to get into the weeds here but let me just show you real quick if we were to create a set and try to pass in customers zero this is going to give us an error unhashable type customer but if you need to understand hashing and all that do some extra research one other thing is you can actually print this list all together at once so you could say print customers and when we do this we don't get the pretty output like we would expect in our method print all customers so one way we can fix this is to override the underscore underscore repr for representation probably and we can just assign this to the same thing as the stirrer method so we'll just say underscore underscore stir and i think that should fix the problem now you get all of the data in a nice list and you can just change the data right here so there you go all right i think that's all the overriding methods i'm going to be talking about right now so let me just zoom out for you guys make sure you can get a good overall picture of the code we'll start at the top and just scroll down to the bottom real quick there you go all right so now we're going to be talking about some object-oriented programming principles these are the three pillars of object-oriented programming if you haven't heard of them yet you probably will a bunch in the future and they are encapsulation inheritance and polymorphism now for being honest each one of these needs a dedicated video to go into the depths so we're just going to scratch the surface but the main thing you need to understand here is that these are the why of object-oriented programming why would you want to use object-oriented programming well if you need to do any of these three things you can do that with oop it's like the value proposition this is what you can get using oop these things can also help you in your object-oriented programming journey by enabling you to do certain things so it basically allows us to have more scalable code and so forth but not all of the time because some of these are even controversial such as inheritance ah if you do it wrong you can actually make your code more complex and not really help anybody and the approach to this really depends on the language because i think different languages have different approaches and ways of thinking and for python it's a very open free kind of language the way you feel you know the vibe of python is very open and free as opposed to java it's very strict and what you can and can't do is very thorough so when we are creating this stuff in python our classes might end up being very thin and if you're coming from say a java background you might be like what and it does take some time to kind of adjust to the approach but basically in python our approach is if you don't need it don't do it and also the person using your classes you can trust them to be well educated and they're going to use your classes in an appropriate way whereas the approach for other languages might be to restrict anybody from doing anything wrong but as a result the classes end up being huge huge files with tons of code so i don't think there is one yes or no or right or wrong way of doing this stuff and i don't want to start any debates in the comments but i do want to try to keep our classes very thin and just do exactly what we need no extra alright with that prefix in mind let's just go through each one of these very briefly encapsulation the whole idea behind encapsulation is that you can hide the inner details of a class or of certain data and you only need to share or expose what is needed for the user of the class to use this class so we might have the backing field as you might hear it called store some data and instead of just people accessing this data directly they access it through getters and setters which are basically methods that will give us access to the data so when we have an attribute such as name well we don't necessarily have to have that same exact thing on the back end there is a separation here where you only set the data through a method and you only get the data through a method so that is the most basic form of encapsulation the most popular thing inside of languages you often have tons of getter methods tons of setter methods inside of python we don't really create those unless we need to and there's a specific way we need to do that with what's known as a property and the good thing about a property is that you can add in a property when it is needed and none of the invoking code changes so you would still access that data like so but now we added some extra functionality in a setter method and a getter method using a property so we're going to touch on that briefly inheritance allows us to automatically have certain attributes for objects because they're defined in a base class so we've been talking about the example of a customer and this is for some subscription website let's say it's a subscription website to get courses well we could also have a teacher and these are going to have a lot in common so we could create a base class with all of the commonalities and let's say this could be called user then when we define a customer it's automatically going to have anything defined inside of this user class so that is the basics of inheritance polymorphism is kind of just an extra step of that where we can treat customers and teachers as the same thing if we approach them as users so we could say hey users we need you to do this or we need to update this data and as a result since a customer is a user that's okay and a teacher is a user that's okay but the customers can do something specific and the teachers can do something specific you know there might be a time of the month where we do the finances for the customers we charge the money and for the teachers we pay them money but we can address all of them together as a set of users so yeah when you're just talking about the theory here without some examples it can be a little bit confusing but i just wanted to just get a really quick overview of these three pieces and now we're going to go hands-on just to get some really simple examples of these so my goal now is to give you what you need for encapsulation inheritance and polymorphism probably can't do it justice in just a few minutes but we're going to give you the essentials here so this is our class so far we have a customer class pretty simple and then we have a list of two customers and we print the customers here so the very first thing i want to do is show you guys how to create a property now a property is basically just like a normal attribute but instead of it being just a variable such as name here or membership type it actually has an extra layer and this layer allows us to basically abstract away the the variable itself using methods so it allows us to have additional functionality it's pretty cool if you need it but in my opinion don't use it if you don't need it and that's just the approach of python that's what i've seen other people do and that's what i have learned is best practice however if you're coming from let's say c sharp and c sharp you just make properties from the get-go so if you want to make every single one of your attributes a property then be my guess but i don't think you're going to be adding a whole lot of value and we want to make these classes as much potent value as possible if that makes any sense at all so let's just get into it enough of my rambling so if we wanted to make name a property what we're going to do is we're going to create two methods we're going to create one that's called name so we'll say name like so as always we're going to put self in there and what this is going to do is it's just going to return self dot underscore name when you see something prefixed with a single underscore this is basically a way to say hey this is private don't touch this if you're not within the class so outside of the class you should not be typing anything like customer index zero dot underscore all these underscore things don't touch them you can see our underscore name right there leave that alone so we're gonna get rid of that and go back up here and leave this as so and one extra step we're going to put at property this is an example of a decorator it gives extra functionality and this is how we say that this is a property so when we try to get the name this is going to be invoked the underscore name is basically the backing field it's the data behind the scenes and anytime we try to set this data we need we're actually going to invoke another method and the way you define that is you say at and then you put whatever the attribute is so name dot setter and then we say def name self and then the data that we're going to assign it so we'll just call that name here and then inside of here we're just going to assign a value to self underscore name and we're going to assign it the parameter value here so if we save this and run we get the same exact output which is what we want none of the invoking code should have to change to use this however we can know that there's an extra step to get and set this data where we can actually add functionality in here if we wanted so we'll just say print getting name and print setting name running it now you can see some extra stuff is going on behind the scenes these methods are being invoked anytime we get or set the value of name but note that we don't actually have to invoke it like a function we can just get it like normal so we can say customers let's say we want that first customer dot name around this we get caleb we did not have to say name with parentheses or get name or anything like that we just used it like normal and that's what we want so that is how to create a property you can do any kind of functionality you want in here you may also see what's known as a deleter which will be used if you use the dell operator so that'll look like this name dot deleter def name self and then we just say del self dot underscore name so we're not going to use that a whole lot but just in case you want to know about that now what that means is we can go down here and we could say dell customers index zero dot name and running this it's going to delete it and it's no longer available if we got rid of that line it works fine so let's go in here and just delete that extra printing because it's not really doing anything just know that that is where the functionality would go now let's take a moment to talk about inheritance and i'm going to keep this really simple but basically we can create another class that customer derives from such as user and we'll just give this user a method so for example we'll say def log so if we wanted to log some data or something and inside of here don't forget self we always want to put self there inside of here we could just say print self so as is if we go down to the very bottom of our code and we try to invoke that so let's just grab our first customer and we say log we run this and it has an issue but if we inherited from that base class then this would be available to us so here's how you do that let's go back up to where we define customer and inside of parentheses you can put user and now anything defined inside of a user is also going to be defined in a customer so when we run this now you can see that this this log here works and actually prints all of that user's data so that's pretty simple when it comes to inheritance nothing too crazy the next step of this is polymorphism so if we actually had a couple of classes that inherited from user let's say we went in here and we created a teacher or something and this also inherits from user and we'll give teacher a new log method and what this is going to do it's going to do pretty much the same thing but it's going to say i'm a teacher instead of just printing all the details about them it's just going to do this blanket statement for all teachers so now you can really see polymorphism if you have a list of teachers and customers you can treat them all as users so let's scroll down to the bottom of our code here and we have two customers in here let's go ahead and add a teacher and just to make sure that we can invoke the log method on each one of these we'll try it on the second customer that works and we can also try it on the teacher and you can see that works so what we can do now is we can basically take this concept where we take the log method and we're going to do that for all of these people so instead of customers here we're going to have users and we say for user and users and we say user dot log so we invoke the log method on every single item in this list and we run it and we don't get any issues so what exactly is the magical part here well we treat them all as users and we invoke dot log because that is part of the user definition but if a derived class has an override such as in this case here we override the log method and gave a new implementation then it's going to do the teacher version of that if we did the same thing for customer it would do the same thing so let's say we take this paste it in here we can say i'm a customer and running this we get i'm a customer i'm a customer and i'm a teacher nowhere does it just do this general print this would just be for the users and you don't see that anywhere so that is the basics of polymorphism basically the ability to create code that works with general users but is still fully functional when you're past something more specific such as a teacher or a customer now i know that's a lot and probably these principles will take a lot more practice to truly grasp and see where to apply these we've touched all the basics of object oriented programming and now some more advanced stuff might come a little bit easier if you're looking for other stuff to research you can look into object relational mappers this is basically going to take database data and correlate it to a bunch of objects in your code so instead of just working with hard-coded stuff in here you could be working with actual teachers and customers in a database you could also look into some different object-oriented design patterns these get pretty advanced and basically teach you how to design programs using these oop principles and there's probably like six quatrillion other things you can study so just look up some more advanced object-oriented programming things and start learning thank you guys for watching if you've enjoyed this content please be sure to subscribe to this channel also be sure to check out my channel caleb curry we got stuff on python javascript c plus java c sharp database design all kinds of different things and would love to have you guys there so be sure to check it out and i'll see you in the next one
Info
Channel: Traversy Media
Views: 169,999
Rating: undefined out of 5
Keywords: python, python programming, python oop, oop, programming, caleb curry, learn python, python code, python for beginners
Id: MikphENIrOo
Channel Id: undefined
Length: 46min 36sec (2796 seconds)
Published: Fri Aug 21 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.