在Python中,如何使类中的对象指向其类对象?

在Python中,如何使类中的对象指向其类对象?,python,oop,Python,Oop,我想创建一个类,其中该类中的一个对象属于不同类型的类(尽管不是以嵌套方式),第二个类对象可以指向包含它的类对象 这很抽象。比如说,我想要一个名为“Party”的类,它包含类Character的对象。假设Party有一个名为Total\u gold的int对象。我知道我可以用以下方法创建: class Party(object): def __init__(self, G1, c1, c2, ...other_stuff_goes_here): self.Total_gol

我想创建一个类,其中该类中的一个对象属于不同类型的类(尽管不是以嵌套方式),第二个类对象可以指向包含它的类对象

这很抽象。比如说,我想要一个名为“Party”的类,它包含类
Character
的对象。假设
Party
有一个名为
Total\u gold
的int对象。我知道我可以用以下方法创建:

class Party(object):
    def __init__(self, G1, c1, c2, ...other_stuff_goes_here):
        self.Total_gold = G1;
        self.char1 = Character(c1);
        self.char2 = Character(c2);
        # more stuff to initiate Party

class Character(object):
    def __init__(self, other_stuff_goes_here):
        # stuff to initiate Character
def Spend(character, amount): 
    #reduces the Total_gold of the party the character belongs to.
    character.Party.Total_gold -= amount
现在,假设我有一个接受Character对象的函数,但我希望它改变包含该字符的
。例如,假设我想要一个函数,
Spend
,它可以减少该方的
总黄金。有没有办法让
Spend
接收角色对象,然后访问角色所在的方?
比如:

class Party(object):
    def __init__(self, G1, c1, c2, ...other_stuff_goes_here):
        self.Total_gold = G1;
        self.char1 = Character(c1);
        self.char2 = Character(c2);
        # more stuff to initiate Party

class Character(object):
    def __init__(self, other_stuff_goes_here):
        # stuff to initiate Character
def Spend(character, amount): 
    #reduces the Total_gold of the party the character belongs to.
    character.Party.Total_gold -= amount
如果是的话,我会怎么做?我假设我需要在
\uuuu init\uuuu
函数中添加一些内容,但我不知道该怎么做。Python没有指针,对吗

如果另一篇文章已经报道了这一点,请让我知道。我甚至不知道该怎么问这个问题


谢谢。

Python对象不会在内部存储任何关于成为另一个对象成员的信息,因此您需要在这两个字符中存储Party的实例。最简单的方法是将
self
传递给
字符

class Character:
    def __init__(self, party, other_arg):
        self.party = party
        # Other stuff goes here

class Party:
    def __init__(self, c1, ...):
    self.char = Character(self, c1)
然后:


一种选择是让每个角色存储自己的黄金。然后创建一个将所有字符的黄金相加的
Party.Total_gold
property
。从面向对象的角度来看,这违反了依赖项反转原则(Dependency Inversion Principle,DIP)。让一个类角色与另一个类角色关联(因为一个类角色有角色)违反了DIPI,就像你使用@property的想法一样;我不知道这些存在,这教会了我一些有用的东西。非常感谢。但是,假设我还需要一种方法来检查金额是否小于Party.Total_gold(这样角色可以比它拥有的黄金多消费,但不能比Party拥有的黄金多消费)。这与@property无关,对吗?请删除此项。这是100%不正确的设计。A有B或B有A,但两者都不是一个好的设计。我的答案完全符合问题的要求。拥有循环引用是糟糕设计的标志,但实现本身并不重要。如果我是OP,我会重新设计我的程序,这样一个对象就不需要知道它包含了什么(这毫无意义),但这不是我的问题,所以我不认为有任何理由删除我的答案。首先,感谢你的回答。第二,有没有一个简单的方法来解释什么是循环引用是糟糕的设计?我曾短暂地主修计算机科学,但我的大部分编码都是自学的,我想我从来没有学会为什么DIP如此重要。谢谢。@Simon一个很好的理由是循环引用永远不会被垃圾收集。但是,在更大的范围内,最好以表示数据的方式构造对象:当容器具有成员对象时,该成员表示容器用于自身目的的某些数据。如果容器和成员需要相互了解,这通常是糟糕工程的标志:例如,您可以传递某种“全局状态”对象,或者将某些功能移动到容器中。