如何从 python 中关联的 class 对象访问方法?

How to access method from associated class object in python?

我有以下代码:

import datetime


class Notebook:

    def __init__(self):
        self._id = 0
        self.notes = []

    def new_note(self, memo, tags=""):
        self.notes.append(Note(self, memo, tags))  # creating Note object instance, passing Notebook object

    def get_id(self):
        id = self._id
        self._id += 1
        return id


class Note:

    def __init__(self, notebook, memo="", tags=""):
        self.id = notebook.get_id()  # accesing Notebook object's get_id method to set a new unique id for a Note object
        self.creation_date = datetime.date.today()
        self.tags = tags
        self.memo = memo

    def __repr__(self):
        return f"[{self.id}, {self.creation_date}, {self.tags}, {self.memo}]"


n = Notebook()
n.new_note("Lorem ipsum", "Latin")
print(n.notes)

这是我根据一本关于​​ OOP 的书创建的练习代码。如您所见,我不得不(据我所知)在创建期间将 Notebook 对象传递给 Note 对象,以便能够 get_id 从创建它的 Notebook 对象获取我的新 Note 对象。

有更好的方法吗?有没有另一种方法可以在不传递整个对象的情况下从创建者 class 访问属性?以这种方式传递对象是一件坏事吗?

主要问题是如何从 Notebook 对象的 self.notes 属性中包含的 Note 对象使用 Notebook 对象的 get_id 方法,而不传递整个 Notebook 对象,如例如。

谢谢!

这是不可能的,而且有充分的理由。想象一下,您的 class 接受用户在创建笔记时指定类型以允许修改,或者从笔记运行一些用户指定的代码。我可以创建一个 MyNote class 来替换 new_note 方法来记录用户所做的所有新笔记。那就麻烦了。

显然这不是问题,因为您对此进行了硬编码,但在允许用户指定的更安全和动态的环境中,伪装良好的恶意 class 可以访问安全的 class创建它。例如,如果您的银行决定使用一个创建加载栏的模块,它不应该在其中查看实例化它的 class。

诚然,在真正安全的情况下,无论如何所有代码都在您的控制之下。

另一种方法可能是 inheritance.this 假设 id 会根据添加到笔记本 class 的每个笔记本自动递增。通过继承,您可以消除一些重复的逻辑。

import datetime


class Note:
    tags = None
    memo = None
    def __init__(self):
       
        self.creation_date = datetime.date.today()   
        self.id = 0
        
    def __repr__(self):
        return 'Note created!'
    
   
    
class Notebook(Note):
    def new_note(self,memo, tags=""):
        self.tags = memo
        self.memo = tags
        return f"[{self.tok()}, {self.creation_date}, {self.tags}, {self.memo}]"
    
    def gen_id(self):
        while True:
            self.id +=1
            yield self.id

    def tok(self):
        a = self.gen_id()
        return next(a)