On Fri, 31 Oct 2014 13:18:00 -0400 Seymore4Head <[email protected]> wrote:
> On Sat, 01 Nov 2014 04:06:44 +1100, Steven D'Aprano > <[email protected]> wrote: > > >Seymore4Head wrote: > > > >> Because the topic of that lesson was getter setter. > >> I can construct an __init___ but I was practicing get/set. > > > >What lesson is that? Using getters/setters is discouraged in Python. > > > >> This stuff is coming to me slowly. I need to rinse and repeat quite a > >> few more times, before I follow what is going on. > > > >Start with the simplest class possible: > > > >class MyClass: > > pass > > > >Right now, that class has a name, "MyClass", no methods, and no data. But we > >can still create an instance. Call the class, as if it were a function, to > >create the instance: > > > >obj = MyClass() > > > >What's the relationship between instances and classes? Classes are a general > >type of entity, instances are a specific example of that entity. You can > >have many instances from a class. So: > > > >Class: Dog > >Instances: Rin-Tin-Tin, Lassie, Hooch (from the "Turner and Hooch" movie), > > Marmaduke, Gaspode the Wonder Dog, Spike the Bulldog, etc. > > > >Class: Wizard > >Instances: Gandalf, Dumbledore, the Wizard of Oz, Rincewind, etc. > > > >Class: int > >Instances: 0, 1, 2, -5, 23, 19874023, etc. > > > > > >You can confirm that obj is now an instance of MyClass: > > > >print(isinstance(obj, MyClass)) > > > >will print True. > > > >What can you do with obj? It has no interesting methods, and no data. But we > >can give it some! Python, unlike some languages, allows you to dynamically > >add data attributes to instances on the fly, without pre-defining them. > > > >obj.value = 23.0 > >obj.message = "hello world!" > >print(obj.value) > >print(obj.message) > > > > > >will associate the data 23.0 and "hello world" to the attributes "value" > >and "message" of the instance obj. > > > >Let's make the class a bit easier to use, at the expense of doing a bit more > >work up front: > > > >class MyClass: > > def __init__(self, value, message): > > self.value = value > > self.message = message > > > >obj = MyClass(23.0, "hello world") > >print(obj.value) > >print(obj.message) > > > > > >The __init__ method is automatically called when you call the class as if it > >were a function. Because the __init__ method has two arguments (plus the > >special "self" argument), you have to call the class with two arguments. > >They get used as the value and message respectively. > > > > > >Or we can give it getters and setters: > > > >class MyClass: > > def set_value(self, value): > > self.value = value > > def get_value(self): > > return self.value > > def set_message(self, message): > > self.message = message > > def get_message(self): > > return self.message > > > >obj = MyClass() > >obj.set_value(23.0) > >obj.set_message("hello world") > >print(obj.get_value()) > >print(obj.get_message()) > > > > > >If you're thinking that's a lot of extra work for not much benefit, 99.99% > >of the time you're right. > > I agree it is more work. But more work means more practice. I need > more practice figuring out how these commands work. > > >obj = MyClass() > >obj.set_value(23.0) > >obj.set_message("hello world") > >print(obj.get_value()) > >print(obj.get_message()) > > I don't know here to get more (simple) practice problems. I am trying > to invent my own. Fine. Practice problem that is actually Pythonic. Define a Rectangle class. Give it length and width attributes, no unnecessary getters or setters. Give it perimeter() and area() methods. Define a Square class, subclassed from Rectangle. Use getters/setters to enforce that the length and width must be equal. Confirm that length and width remain locked, and that perimeter() and area() work correctly. -- Rob Gaddi, Highland Technology -- www.highlandtechnology.com Email address domain is currently out of order. See above to fix. -- https://mail.python.org/mailman/listinfo/python-list
