Home > Blockchain >  Can i use 'self' in classes on its own?
Can i use 'self' in classes on its own?

Time:05-13

I have a list of objects of the Person class. This list includes myself, so I need to remove "myself" from the list.

It means I need to remove the object from the list that calls this method.

class Population:
    def __init__(self):
        self.people = list()

class Person:
    def __init__(self):
        self.friends_list = list()

    def make_friends(self, population, n):
        temp_list = population.copy()
        temp_list.remove(self)
        self.friends_list.extend(random.sample(temp_list,n))

my test:

per = Person()
per2 = Person()
per3 = Person()
per4 = Person()
per5 = Person()
pop = [per,per2,per3,per4,per5]
for per in pop:
    per.make_friends(pop, 2)
    print('ME: ',per)
    print(per.friends_list)

My tests run well, but there are general tests that check the code and they generate an error on this line:

try:
    stud_res = person.make_friends(population, count)
except Exception:
    print("\tPerson.make_friends() generated error")
    return

Can I use self in this way, and if not, how can I better remove "myself" from the list?

CodePudding user response:

It is a perfectly fine use case. By the way, note that you're overriding the builtin list.

CodePudding user response:

To use self, you have to share a list collection between instances of a Person-class. In that case this collection should be declared as a class attribute or global list variable (not an instance attribute).

These samples of code are working:

with global list variable:

class Person:

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

    def make_friends(self, list):
        list.remove(self)

    def __repr__(self):
        return self.name


p1 = Person("Joe")
p2 = Person("Barack")

the_list = []
the_list.append(p1)
the_list.append(p2)

p1.make_friends(the_list)

print(the_list)

With class attribute:

class Person2:
    class_list = []

    def __init__(self, name):
        self.name = name
        Person2.class_list.append(self)

    def make_friends(self):
        Person2.class_list.remove(self)

    def __repr__(self):
        return self.name


p1 = Person2("Joe")
p2 = Person2("Barack")
print(Person2.class_list)
p1.make_friends()
print(Person2.class_list)

EDIT: Variable 3 when a list of people is inside another class. For accessing a list inside another class you could use attribute name or public method to get it if implemented:

class ClassWithList:
    def __init__(self):
        self.list_collection = []

    def get_list(self):
        return self.list_collection


class_with_list = ClassWithList()


class Person:

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

    def make_friends(self, list):
        list.remove(self)

    def __repr__(self):
        return self.name


p1 = Person("Joe")
p2 = Person("Barack")
# using implemented get-method of instance list attribute
class_with_list.get_list().append(p1)
class_with_list.get_list().append(p2)
print(class_with_list.get_list())
p1.make_friends(class_with_list.get_list())

print(class_with_list.get_list())

# instance list attribute of class`ClassWithList
print(class_with_list.list_collection)
p2.make_friends(class_with_list.list_collection)
print(class_with_list.list_collection) 
  • Related