user1714768
user1714768

Reputation: 29

how a class works

I am trying to figure out a really simple problem but still I can't quite get how a class works. For example, in case I wanted to create a class called "Friend" with an attribute called "name", does this mean I will have to give a variable called "name"before anything else ? Then how can i define the constructor to allow the specification of "name"? Is this code nonsense? Thanks in advance for any response

class Friend:

    def __init__(self,name):
        self.set_name(name)


    def set_name(self,name):
        self.name=name

    def get_name(self):
        return self.name

Upvotes: 2

Views: 136

Answers (2)

jdi
jdi

Reputation: 92569

What you are referring to is default keyword arguments. The way you have specified it in your example means that name is required in the constructor. The way to make it default (and be able to be set after the constructor) would look like this:

class Friend(object):

    def __init__(self,name=''):
        self.name = name

    def set_name(self,name):
        self.name=name

    def get_name(self):
        return self.name

Now your class can be instantiated without a name:

aFriend = Friend()

As suggested in comments, it is not "considered pythonic" to have setters and getters for a basic attribute. But, if that attribute requires computation, then you can make it a property:

class Friend(object):

    def __init__(self, firstname='', lastname=''):
        self.firstname = firstname
        self.lastname = lastname

    @property
    def firstname(self):
        return self._first

    @firstname.setter
    def firstname(self, n):
        self._first = n.capitalize()

    @property
    def lastname(self):
        return self._last

    @lastname.setter
    def lastname(self, n):
        self._last = n.capitalize()        

    @property
    def fullname(self):
        return "{0} {1}".format(self.firstname, self.lastname)   

f = Friend('frank')
f.lastname = 'smith'

f.firstname
# 'Frank'

f.lastname
#'Smith'

f.fullname
#'Frank Smith'

Upvotes: 2

dm03514
dm03514

Reputation: 55962

That code is not nonsense as in it accomplishes what you want to accomplish. It is not very pythonic, though. There are no reason you should use getter or setters. Just access the attributes directly. Like

class Friend:

    def __init__(self,name):
        self.name = name

you can instantiate your class by

friend = Friend('jeremy')

now just access name directly

print friend.name # jeremy

There is a good amount to learn about python classes luckily python provides excellent documentation for whatever version you are on.

in this example, to create a new friend you need to instantiate it with a name.

Upvotes: 8

Related Questions