Hướng dẫn can self be changed in python? - có thể tự thay đổi trong python không?

Tôi muốn thay thế một thể hiện đối tượng bằng một thể hiện khác bên trong một phương thức như thế này:

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

Đối tượng được lấy từ cơ sở dữ liệu.

Hướng dẫn can self be changed in python? - có thể tự thay đổi trong python không?

Ayman giờ

127K22 Huy hiệu vàng141 Huy hiệu bạc116 Huy hiệu đồng22 gold badges141 silver badges116 bronze badges

Hỏi ngày 1 tháng 8 năm 2009 lúc 10:42Aug 1, 2009 at 10:42

1

Không có khả năng thay thế biến 'bản thân' sẽ hoàn thành bất cứ điều gì bạn đang cố gắng làm, điều đó không thể thực hiện được bằng cách lưu trữ kết quả của func (tự) trong một biến khác. 'Tự' thực sự là một biến cục bộ chỉ được xác định cho thời lượng của cuộc gọi phương thức, được sử dụng để vượt qua trong trường hợp của lớp đang được vận hành. Thay thế bản thân sẽ không thực sự thay thế các tài liệu tham khảo thành thể hiện ban đầu của lớp được giữ bởi các đối tượng khác, cũng sẽ không tạo ra một tham chiếu lâu dài cho trường hợp mới được gán cho nó.

Đã trả lời ngày 1 tháng 8 năm 2009 lúc 10:45Aug 1, 2009 at 10:45

AmberamberAmber

491K81 Huy hiệu vàng618 Huy hiệu bạc546 Huy hiệu đồng81 gold badges618 silver badges546 bronze badges

4

Theo như tôi hiểu, nếu bạn đang cố gắng thay thế đối tượng hiện tại bằng một đối tượng khác có cùng loại (giả sử func sẽ không thay đổi loại đối tượng) từ hàm thành viên. Tôi nghĩ rằng điều này sẽ đạt được điều đó:

class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)

Hướng dẫn can self be changed in python? - có thể tự thay đổi trong python không?

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

Đã trả lời ngày 6 tháng 6 năm 2016 lúc 13:23Jun 6, 2016 at 13:23

NithinnithinNithin

5.02032 Huy hiệu bạc44 Huy hiệu đồng32 silver badges44 bronze badges

1

Nó không phải là một câu trả lời trực tiếp cho câu hỏi, nhưng trong các bài đăng dưới đây có một giải pháp cho những gì Amirouche đã cố gắng làm:

  • Chuyển đổi đối tượng Python
  • Tôi có thể tự động chuyển đổi một thể hiện của một lớp này sang lớp khác không?

Và đây là mẫu mã làm việc (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

Lưu ý

class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
0 chứ không phải
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
1. I E. Kỹ thuật này không chỉ thay thế tên lớp, mà thực sự chuyển đổi một thể hiện của một lớp (ít nhất cả hai đều có cùng
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
2). Ngoài ra, 1) Tôi không biết liệu có phải là "an toàn để thay thế một đối tượng tự bằng một đối tượng khác cùng loại trong phương thức [một đối tượng]"; 2) Nó hoạt động với các loại đối tượng khác nhau, không chỉ với các loại cùng loại; 3) Nó hoạt động không chính xác như Amirouche muốn: Bạn không thể khởi động như
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
3, chỉ
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
4 (Tôi không phải là chuyên gia và không thể trả lời tại sao nó như thế này).

Đã trả lời ngày 30 tháng 8 năm 2013 lúc 9:20Aug 30, 2013 at 9:20

PugsleyleyleyPugsley

96513 Huy hiệu bạc13 Huy hiệu đồng13 silver badges13 bronze badges

Có, tất cả những gì sẽ xảy ra là bạn sẽ không thể tham khảo phiên bản hiện tại của lớp

class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
5 (trừ khi bạn đặt một biến khác thành
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
6 trước khi bạn thay đổi nó.) mã số.

Lưu ý rằng bạn chỉ thay đổi một biến, giống như bất kỳ biến nào khác. Làm

class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
7 giống như làm
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
8.
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
6 chỉ là một tham chiếu đến thể hiện hiện tại trong phương thức. Bạn không thể thay đổi thể hiện của mình bằng cách đặt
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
6.

Điều mà

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
1 nên làm là thay đổi các biến trong phiên bản của bạn:

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

Sau đó làm điều này:

class A:
    def method1(self):
        func(self) # No need to assign self here

Đã trả lời ngày 1 tháng 8 năm 2009 lúc 10:44Aug 1, 2009 at 10:44

BlixtblixtBlixt

49K13 Huy hiệu vàng118 Huy hiệu bạc153 Huy hiệu đồng13 gold badges118 silver badges153 bronze badges

Trong nhiều trường hợp, một cách tốt để đạt được những gì bạn muốn là gọi lại

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
2. Ví dụ:

class MyList(list):
    def trim(self,n):
        self.__init__(self[:-n])

x = MyList([1,2,3,4])
x.trim(2)
assert type(x) == MyList
assert x == [1,2]

Lưu ý rằng điều này đi kèm với một vài giả định như tất cả những gì bạn muốn thay đổi về đối tượng được đặt trong

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
2. Ngoài ra, hãy cẩn thận rằng điều này có thể gây ra các vấn đề với việc kế thừa các lớp xác định lại
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
2 theo cách không tương thích.

Đã trả lời ngày 31 tháng 5 năm 2019 lúc 7:43May 31, 2019 at 7:43

Hướng dẫn can self be changed in python? - có thể tự thay đổi trong python không?

WRZLPRMFTWRZLPRMFTWrzlprmft

3.9191 Huy hiệu vàng29 Huy hiệu bạc52 Huy hiệu đồng1 gold badge29 silver badges52 bronze badges

Vâng, không có gì sai với điều này. Ghét sẽ ghét. (Nhìn vào bạn pycharm với

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
5 của bạn).

Một tình huống mà bạn có thể làm điều này là:

some_method(self, ...):

    ...

    if(some_condition):
        self = self.some_other_method()

    ...

    return ...

Chắc chắn, bạn có thể bắt đầu cơ thể phương thức bằng cách chỉ định lại

class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
6 cho một số biến khác, nhưng nếu bạn thường không làm điều đó với các tham số khác, tại sao lại làm điều đó với
class A:
    def method1(self):
        newObj = func(self)
        self.__dict__.update(newObj.__dict__)
6?

Đã trả lời ngày 25 tháng 1 năm 2018 lúc 9:45Jan 25, 2018 at 9:45

Oulenzoulenzoulenz

1.1491 Huy hiệu vàng14 Huy hiệu bạc23 Huy hiệu đồng1 gold badge14 silver badges23 bronze badges

Người ta có thể sử dụng phép tự phân công trong một phương thức, để thay đổi lớp thể hiện thành một lớp dẫn xuất.

Tất nhiên người ta có thể gán nó cho một đối tượng mới, nhưng sau đó việc sử dụng đối tượng mới gợn sóng thông qua phần còn lại của mã trong phương thức. Tái định vị nó thành bản thân, để lại phần còn lại của phương pháp không bị ảnh hưởng.

class aclass:

    def methodA(self):
        ...
        if condition:
            self = replace_by_derived(self)
            # self is now referencing to an instance of a derived class
            # with probably the same values for its data attributes

        # all code here remains untouched
        ...
        self.methodB() # calls the methodB of derivedclass is condition is True
        ...

    def methodB(self):
        # methodB of class aclass
        ...

class derivedclass(aclass):
    def methodB(self):
        #methodB of class derivedclass
        ...

Nhưng ngoài một trường hợp sử dụng đặc biệt như vậy, tôi không thấy bất kỳ lợi thế nào để thay thế bản thân.

Đã trả lời ngày 26 tháng 9 năm 2013 lúc 9:06Sep 26, 2013 at 9:06

Hướng dẫn can self be changed in python? - có thể tự thay đổi trong python không?

Ruben decropruben giảmRuben Decrop

1.8711 Huy hiệu vàng17 Huy hiệu bạc9 Huy hiệu đồng1 gold badge17 silver badges9 bronze badges

1

Bạn có thể biến thể hiện một yếu tố đơn lẻ của lớp và đánh dấu các phương thức bằng

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
8.

from enum import IntEnum
from collections import namedtuple

class kind(IntEnum):
    circle = 1
    square = 2

def attr(y): return [getattr(y, x) for x in 'k l b u r'.split()]

class Shape(namedtuple('Shape', 'k,l,b,u,r')):
    self = None

    @classmethod
    def __repr__(cls):
        return "<Shape({},{},{},{},{}) object at {}>".format(
            *(attr(cls.self)+[id(cls.self)]))

    @classmethod
    def transform(cls, func):
        cls.self = cls.self._replace(**func(cls.self))

Shape.self = Shape(k=1, l=2, b=3, u=4, r=5)
s = Shape.self

def nextkind(self):
    return {'k': self.k+1}

print(repr(s))  # <Shape(1,2,3,4,5) object at 139766656561792>
s.transform(nextkind)
print(repr(s))  # <Shape(2,2,3,4,5) object at 139766656561888>

Đã trả lời ngày 17 tháng 10 năm 2020 lúc 20:23Oct 17, 2020 at 20:23

Có thể tự được thay thế trong Python?

Tự chỉ là một tham chiếu đến thể hiện hiện tại trong phương thức.Bạn không thể thay đổi thể hiện của mình bằng cách tự đặt bản thân.Lưu câu trả lời này.You can't change your instance by setting self . Save this answer.

Tự mình có đặc biệt trong Python không?

Viết tham số này là bản thân chỉ là một quy ước.Nó không phải là một từ khóa và không có ý nghĩa đặc biệt trong Python.Chúng ta có thể sử dụng các tên khác (như thế này) nhưng nó rất nản lòng.Sử dụng các tên khác ngoài bản thân được hầu hết các nhà phát triển cau mày và làm suy giảm khả năng đọc của mã (số lượng dễ đọc).It is not a keyword and has no special meaning in Python. We could use other names (like this ) but it is highly discouraged. Using names other than self is frowned upon by most developers and degrades the readability of the code (Readability counts).

Tự () trong Python là gì?

Tham số tự là tham chiếu đến thể hiện hiện tại của lớp và được sử dụng để truy cập các biến thuộc về lớp.a reference to the current instance of the class, and is used to access variables that belongs to the class.

Bản thân có giống như thế này trong Python không?

Về mặt kỹ thuật, cả bản thân và điều này đều được sử dụng cho cùng một điều.Chúng được sử dụng để truy cập biến liên quan đến thể hiện hiện tại.Chỉ có sự khác biệt là, bạn phải bao gồm một cách rõ ràng như tham số đầu tiên cho một phương thức thể hiện trong Python, trong khi đây không phải là trường hợp với Java.. They are used to access the variable associated with the current instance. Only difference is, you have to include self explicitly as first parameter to an instance method in Python, whereas this is not the case with Java.