首页 > 解决方案 > 如何从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 对象,以便能够从创建它的 Notebook 对象中获取我的新 Note 对象的 get_id。

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

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

谢谢!

标签: pythonpython-3.xoopmethodsattributes

解决方案


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

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

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


推荐阅读