Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it safe to replace a self object by another object of the same type in a method?

Tags:

python

I would like to replace an object instance by another instance inside a method like this:

class A:
    def method1(self):
        self = func(self)

The object is retrieved from a database.

like image 682
amirouche Avatar asked Aug 01 '09 10:08

amirouche


People also ask

Can we use something else instead of self in python?

The term self isn't a keyword in python like it is in, say, Java. The user can choose to name it anything they want - although it would be better to choose one name and stick with that throughout the code for clarity, there isn't anything stopping you from naming it something different in every method.

Can an object be an attribute of another object?

Yes. Show activity on this post. You can have both instances and classes as attributes of both classes and instances -- all four combinations work just fine (and can be combined freely).

Can the type of an object change in python?

[1] It is possible in some cases to change an object's type, under certain controlled conditions. It generally isn't a good idea though, since it can lead to some very strange behaviour if it is handled incorrectly. Oh, didnt notice that. So I DID changed the type.

What is the function of self in python?

The self parameter is a reference to the current instance of the class, and is used to access variables that belongs to the class.


4 Answers

It is unlikely that replacing the 'self' variable will accomplish whatever you're trying to do, that couldn't just be accomplished by storing the result of func(self) in a different variable. 'self' is effectively a local variable only defined for the duration of the method call, used to pass in the instance of the class which is being operated upon. Replacing self will not actually replace references to the original instance of the class held by other objects, nor will it create a lasting reference to the new instance which was assigned to it.

like image 92
Amber Avatar answered Sep 29 '22 03:09

Amber


As far as I understand, If you are trying to replace the current object with another object of same type (assuming func won't change the object type) from an member function. I think this will achieve that:

class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
like image 44
Nithin Avatar answered Sep 29 '22 04:09

Nithin


It is not a direct answer to the question, but in the posts below there's a solution for what amirouche tried to do:

  • Python object conversion
  • Can I dynamically convert an instance of one class to another?

And here's working code sample (Python 3.2.5).

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

    def who_are_you(self):
        print("I'm a men! My name is " + self.name)

    def cast_to(self, sex, name):
        self.__class__ = sex
        self.name = name

    def method_unique_to_men(self):
        print('I made The Matrix')


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

    def who_are_you(self):
        print("I'm a women! My name is " + self.name)

    def cast_to(self, sex, name):
        self.__class__ = sex
        self.name = name

    def method_unique_to_women(self):
        print('I made Cloud Atlas')


men = Men('Larry')
men.who_are_you()
#>>> I'm a men! My name is Larry
men.method_unique_to_men()
#>>> I made The Matrix


men.cast_to(Women, 'Lana')
men.who_are_you()
#>>> I'm a women! My name is Lana
men.method_unique_to_women()
#>>> I made Cloud Atlas

Note the self.__class__ and not self.__class__.__name__. I.e. this technique not only replaces class name, but actually converts an instance of a class (at least both of them have same id()). Also, 1) I don't know whether it is "safe to replace a self object by another object of the same type in [an object own] method"; 2) it works with different types of objects, not only with ones that are of the same type; 3) it works not exactly like amirouche wanted: you can't init class like Class(args), only Class() (I'm not a pro and can't answer why it's like this).

like image 17
Pugsley Avatar answered Sep 29 '22 04:09

Pugsley


Yes, all that will happen is that you won't be able to reference the current instance of your class A (unless you set another variable to self before you change it.) I wouldn't recommend it though, it makes for less readable code.

Note that you're only changing a variable, just like any other. Doing self = 123 is the same as doing abc = 123. self is only a reference to the current instance within the method. You can't change your instance by setting self.

What func(self) should do is to change the variables of your instance:

def func(obj):
    obj.var_a = 123
    obj.var_b = 'abc'

Then do this:

class A:
    def method1(self):
        func(self) # No need to assign self here
like image 8
Blixt Avatar answered Sep 29 '22 03:09

Blixt