Python模拟C++;指向类成员的指针

Python模拟C++;指向类成员的指针,python,c++,Python,C++,是否可以创建指向Python类成员(而不是方法)的指针 我想要这样的东西: class PClass: def __init__(self): self.a = 123 def foo(self, a): self.a = a # this works def bar(pointer_to_method): py_ex = PClass() pointer_to_method(py_ex, 321) bar(PClass.foo)

是否可以创建指向Python类成员(而不是方法)的指针

我想要这样的东西:

class PClass:
    def __init__(self):
        self.a = 123
    def foo(self, a):
        self.a = a

# this works
def bar(pointer_to_method):
    py_ex = PClass()
    pointer_to_method(py_ex, 321)
bar(PClass.foo)

# this does not
def boo(pointer_to_member):
    py_ex = PClass()
    py_ex.pointer_to_member = 321

boo(PClass.a)
<>在C++中,我可以创建指针类和类函数< /p>
class CClass
{
public:
    int CClass_property_1;
    int CClass_property_2;
    void CClass_method(const int& param){}
};
auto method_pointer = &CClass::CClass_method;
auto propery_1_pointer = &CClass::CClass_property_1;
propery_1_pointer = &CClass::CClass_property_2;
现在我可以使用CClass的实例从指针调用函数,或者访问属性


我对Python模拟感兴趣到C++指针,对类属性(不是方法)

看起来你正在混合<代码>类< /COD>和<代码>实例< /C>。Python中的差异比C++更清楚。 下面是对您的代码的重写:

class PClass:
    def __init__(self):
        self.a = 123
    def foo(self, a):
        self.a = a


def bar(pointer_to_method):
    pointer_to_method(321)

def boo(pointer_to_member):
    pointer_to_member = 321

instance = PClass()

bar(instance.foo)  # Note that I pass foo bound to instance in the one parameter

boo(instance.a) # Again the member a is bound to instance in the one parameter
PClass
从来没有
a
成员。但是,
PClass
的每个实例都有一个
a
成员,因为初始化器创建了一个成员

更新

但是正如@Bruno所指出的,上面的函数
boo
没有任何作用,因此您可能需要一些不同的东西:

def zoo(inst, member_name):
    setattr(inst, member_name, 322)

# call like this:
zoo(instance, "a")

<>这不是一个 > C++成员的代码>,但它可能是你要找的。

python在内存模型和变量“真的是”时完全不同于C++,所以你的问题没有意义。理解为什么仅仅是“指针”的概念在Python中不适用

wrt/您的python代码段:

class PClass:
    def __init__(self):
        self.a = 123
    def foo(self, a):
        self.a = a

# this works
def bar(pointer_to_method):
    py_ex = PClass()
    pointer_to_method(py_ex, 321)

bar(PClass.foo)
这是因为
PClass.foo
求值到一个未绑定的方法(python2.x)或直接求值到
foo
函数(是的,“函数”-cf)-但在这两种情况下都求值到一个可调用的对象,该对象要么是您的函数,要么是它周围的小包装器

# this does not
def boo(pointer_to_member):
    py_ex = PClass()
    py_ex.pointer_to_member = 321

boo(PClass.a)
这不能按原样工作,因为
a
不是
PClass
类对象的属性,而是
PClass
实例的属性,所以这里您得到了一个AttributeError

现在,即使您尝试quamrana的代码段(使用
PClass
实例),您也会通过AttributeError问题,但代码仍然不起作用,即:

def boo(pointer_to_member):
    pointer_to_member = 321

instance = PClass()
boo(instance.a)
不会引发错误,但仍不会更新
实例。a
。这里的原因是我链接到的整篇文章的主题,所以我不会深入讨论太多细节,但长话短说,python变量只是一个名称,而不是内存地址,因此在上面的代码中,
instance.a
是第一个值,值(绑定到
instance.a
int
实例)以“指针指向成员”的名称传递给
boo()
。此名称是本地名称,因此重新绑定它只会影响函数的本地名称空间,此时代码完全不知道
实例
,也不知道它的
属性

现在,如果你想解释你在这里试图解决的问题,我们当然可以为你指出正确的pythonic解决方案。重点是:在Python中尝试编写C++与在C++中尝试编写Python一样,是不可用的——不同的语言、不同的习语和模式。 所以类有方法,但没有成员?而类的实例两者都有吗

在Python中,我们说的是“属性”,而不是“成员”。是的,类也可以有属性(类是对象,
type
类的实例),但这些属性在类的所有实例之间共享。FWIW,“方法”实际上是类属性(是的,函数也是对象-实际上一切都是对象-它们不存在于不同的命名空间中)


此外,实例本身不具有“方法”——这些方法是类对象的属性(实际上也是C++中的情况),但是Python的属性查找规则(在点式访问中调用的代码)在类(以及它的父类)中查找如果在实例本身上没有找到的名称。您可以阅读我链接的第二篇文章,了解Python“方法”的真正含义(这篇文章需要更新以反映Python3的变化,但除了

Class.methodname
产生的内容外,大部分内容仍然是准确的)。

您尝试过您的代码吗?提示:不必麻烦,它的效果并不比OP的好。那么为什么我可以创建指向类成员的指针(不是类的实例)@deMont我目前正在尝试回答,请稍等,但您不是“创建指向类成员的指针”,您只是引用了一个对象,它恰好是类的一个属性(这肯定不是同一件事)。所以类有方法,但没有成员?虽然类的实例两者都有?类和实例都可以同时有方法和成员(或变量-它们都是变量),但您的示例恰好只有前者。您是否愿意解释一下如何使用这些“属性指针”,以及您实际上正试图解决哪种类型的问题?解释为什么Python代码不能按预期工作是一回事,但是如果我们知道为什么您认为您需要此功能,我们可能会为您指出正确的Python解决方案。