我通常使用类似于人们如何使用namedtuple
(当然除了属性是可变的)。此外,我尝试将冗长的函数放在不经常实例化的类中,以帮助节省内存。
从内存的角度来看,如果期望经常实例化类,那么将函数放在类中是否效率低?撇开这是划分功能的好设计,这应该是值得担心的吗?
答案 0 :(得分:6)
方法不会为您的类的实例添加任何权重。该方法本身只存在一次,并根据其运行的对象进行参数化。这就是为什么你有一个self
参数。
答案 1 :(得分:2)
Python在新式类的实例中没有直接指向其方法的指针。相反,它维护一个指向父类的指针。请考虑以下示例:
class Foo:
def bar(self):
print 'hello'
f = Foo()
f.bar()
为了从实例f调度bar方法,需要进行两次查找。 f包含对类对象Foo的引用,而不是包含方法表的f来查找bar。 Foo包含方法表,在其中调用bar,f为第一个参数。所以f.bar()可以改写为
Foo.bar(f)
答案 2 :(得分:2)
类的实例有一个引用该类的指针;该类的所有其他功能都是唯一的,并通过该指针访问。像
这样的东西foo.bar()
真的翻译为
foo.__class__.bar(foo)
因此,方法是属于该类的唯一且长期存在的对象,在调用时将该实例作为参数。
答案 3 :(得分:2)
每个对象都有自己的数据成员副本,而成员函数是共享的。编译器创建一个与该类的所有对象分开的成员函数的副本。该类的所有对象共享这一个副本。
OOP的重点是将数据和功能结合在一起。没有OOP,数据就无法重复使用,只能重用这些功能。