On Sat, Jan 23, 2016 at 3:30 AM, Cameron Simpson <c...@zip.com.au> wrote:
> On 23Jan2016 01:52, boB Stepp <robertvst...@gmail.com> wrote:


>> I guess no matter how new one is to OOP, one nevertheless brings one's
>> preconceptions, however malformed, into the learning process.  In my
>> case, one of mine was that once a class is coded, any given instance
>> of a class is forevermore responsible for managing its *internals*, so
>> that any change in these would be managed by the object when one of
>> its (meant to be) publicly available methods is called.
>
>
> That is the pure OO way; and you can do things that way in Python, though
> you can't _prevent_ direct access.  However, it isn't the common way with
> Python; generally with a Python class there are public attributes with
> ordinary names; outsiders can consult them but generally should not change
> them unless the doco says that is ok...

I'd like to focus on this last sentence.  Are you suggesting that it
is "better" programming practice to code the class so that it has its
own publicly available methods to process its public attributes?  And
that it is both good practice and Pythonic to allow outsiders to
freely read public attributes as needed?


>> I suspect there are probably better ways to do what I am trying to
>> demonstrate [I am trying to use a dict to simulate adding new instance
>> variables after the fact.],
>
>
> You're aware that most objects have a .__dict__ attribute containing the
> attributes? It is a dict, btw. So:
>
>  class O(object):
>    pass
>
>  >>> o=O()
>  >>> o.x=1
>  >>> o.__dict__
>  {'x': 1}

The book I am currently working through, "Python Crash Course",
despite its title, is oriented towards beginners to programming.  It
does not cover dunder methods and attributes, other than __init__().
I am aware from following this list and reading portions of other
books, that they exist, but I have not gotten into the details of any
of them.  So rewriting my class to use .__dict__, I have gotten:

>>> class Dog(object):
        def __init__(self, name, breed):
            self.name = name
            self.breed = breed
            self.number_legs = 4
            self.number_tails = 1
            self.number_eyes = 2
        def show_attributes(self):
            print("The object,", self.name, "has the following attributes:")
            for attribute_name, attribute_value in self.__dict__.items():
                print(attribute_name, "=", attribute_value)

>>> our_dog = Dog('Copper', 'beagle')
>>> our_dog.show_attributes()
The object, Copper has the following attributes:
number_tails = 1
number_eyes = 2
breed = beagle
number_legs = 4
name = Copper
>>> our_dog.unique_marking = 'blue right eye'   # Adding a new attribute from 
>>> outside the class definition.
>>> our_dog.show_attributes()
The object, Copper has the following attributes:
number_eyes = 2
breed = beagle
unique_marking = blue right eye
number_tails = 1
number_legs = 4
name = Copper

I have to say that this seems very simple and direct despite my
initial reluctance to assign new attributes to an object from outside
the class definition of that object.

I still would like to do this via a method, but I am currently stuck
on how to replace ??? with the attribute name I would like to insert:

class Dog(object):
    ...

    def add_attribute(self, attribute_name, attribute_value):
        self.??? = attribute_value

If I write something like:

unique_marking = 'blue right eye'
our_dog.add_attribute(unique_marking, 'blue right eye)

I cannot get ??? to be unique_marking.  Instead, show_attributes()
will give from .__dict__, 'attribute_name', instead of what I would
like to replace it with, unique_marking.  But I have not given up yet!
 But since I am struggling to accomplish this, that argues (my
ignorance of Python aside) strongly for the clear, simple, direct
approach above that I did in my rewrite.

>
> Alan will take you up on doing purer OO practices in Python.
>

An inside joke?  Jedi Master Alan, please instruct me in the Pythonic
ways of OO purity!

-- 
boB
_______________________________________________
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor

Reply via email to