如何从 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)
我有以下代码:
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)