Python 3.x Python类方法也是实例方法

Python 3.x Python类方法也是实例方法,python-3.x,class-method,instance-methods,Python 3.x,Class Method,Instance Methods,我有一个类,原则上在它的类体中包含所有关于它的信息。实例化时,它将接收附加信息,这些信息与类属性一起构成常规实例。我现在的问题在于,我需要实现一个方法,当从类对象调用该方法时,该方法应作为类方法调用,但当从实例调用时,该方法应作为常规实例方法调用: e、 差不多 类MyClassobject: 属性=1,2,3 def myMethodself,参数: 如果isclassself: 上课 其他: 做实例的东西 MyClass.myMethod2现在应该作为类方法调用,例如,我通常会执行@clas

我有一个类,原则上在它的类体中包含所有关于它的信息。实例化时,它将接收附加信息,这些信息与类属性一起构成常规实例。我现在的问题在于,我需要实现一个方法,当从类对象调用该方法时,该方法应作为类方法调用,但当从实例调用时,该方法应作为常规实例方法调用:

e、 差不多

类MyClassobject: 属性=1,2,3 def myMethodself,参数: 如果isclassself: 上课 其他: 做实例的东西 MyClass.myMethod2现在应该作为类方法调用,例如,我通常会执行@classmethod MyClass.myMethod2现在应作为实例方法调用
当然,我可以将其声明为staticmethod并显式地传递实例或类对象,但这似乎不太符合语法,而且对用户也不友好

如果方法的行为不同,您可以在初始化时简单地更改以该名称公开的方法:

MyCrazyClass类: @类方法 def magicmethcls: 我是一个班 def_magicmethself: 我是一个例子 定义初始自我: self.magicmeth=self.\u magicmeth
如果这些方法的行为不同,您只需在初始化时更改以该名称公开的方法:

MyCrazyClass类: @类方法 def magicmethcls: 我是一个班 def_magicmethself: 我是一个例子 定义初始自我: self.magicmeth=self.\u magicmeth
您可以定义一个decorator,它在实例上调用时与常规方法类似,在类上调用时与类方法类似。这需要:


请注意,这种行为对大多数程序员来说并不明显。只有在您真正需要时才使用它。

您可以定义一个decorator,它在实例上调用时与常规方法类似,在类上调用时与类方法类似。这需要:


请注意,这种行为对大多数程序员来说并不明显。只有在你真的需要的时候才使用它。

很好,谢谢,这样就可以了。这仍然被认为是可以接受的编程风格,还是它掩盖了太多在后台发生的事情?老实说,您的整个请求似乎很奇怪,我不能说我以前见过这种模式。不坏,只是奇怪。也许如果你的问题更明确一点,说明你到底想做什么,那么给出一个合适的建议就更容易了。问题是,默认情况下,我只对类对象进行操作,而实例对象只在某些特殊情况下起作用,在这种情况下,需要关于类对象的附加信息。考虑这个例子:通常一个物理单元是像值*因子1米,你可以把它转换成一个不同的单位简单地通过制作NeVaV= OLVALV*OLDFECT/NEWEFATE。但有时您可能还需要像1米**2这样的幂,在我的例子中,这是Meter类的一个实例,但是转换需要知道实例的幂。@Torilla注意平方米与米的类型不同。米*米就像米*秒一样是米,也就是说根本不是。如果你用这样的单位模型,你的单位系统就坏了。我不太清楚你说的是什么意思。我认为任何单位SI单位,作为一个独立的维度。例如,对于长度、时间、质量等,我有一个定义良好的基类。这一切都很好。当从多个基本单位(例如焦耳==kg m²s)中定义一个单位时,就会出现问题⁻²其中可以对由其基本单位定义的类对象进行操作,但也可以添加幂,例如J²==kg²m⁴s⁻⁴ == kg m²s⁻很好,谢谢,应该可以了。这仍然被认为是可以接受的编程风格,还是它掩盖了太多在后台发生的事情?老实说,您的整个请求似乎很奇怪,我不能说我以前见过这种模式。不坏,只是奇怪。也许如果你的问题更明确一点,说明你到底想做什么,那么给出一个合适的建议就更容易了。问题是,默认情况下,我只对类对象进行操作,而实例对象只在某些特殊情况下起作用,在这种情况下,需要关于类对象的附加信息。考虑这个例子:通常一个物理单元是像值*因子1米,你可以把它转换成一个不同的单位简单地通过制作NeVaV= OLVALV*OLDFECT/NEWEFATE。但有时您可能还需要像1米**2这样的幂,在我的例子中,这是Meter类的一个实例,但是转换需要知道实例的幂。@Torilla注意平方米与米的类型不同。米*米就像米*秒一样是米,也就是说根本不是。如果你像这样建模,你的单位
t系统坏了。我不太清楚你说的是什么意思。我认为任何单位SI单位,作为一个独立的维度。例如,对于长度、时间、质量等,我有一个定义良好的基类。这一切都很好。当从多个基本单位(例如焦耳==kg m²s)中定义一个单位时,就会出现问题⁻²其中可以对由其基本单位定义的类对象进行操作,但也可以添加幂,例如J²==kg²m⁴s⁻⁴ == kg m²s⁻虽然这可以通过创建一个类似于classmethod的描述符来完成,但是classmethods和常规方法的用途通常是非常不同的。强烈地考虑调用一个统一方法是否容易超过了解每个单独的方法所做的事情。虽然这样做可以创建类似于类方法的描述符,但是类方法和常规方法的目的通常是非常不同的。强烈地考虑调用一个统一方法是否容易超过了解每个单独方法所做的事情的容易程度。
from functools import partial

class anymethod:
    """Transform a method into both a regular and class method"""
    def __init__(self, call):
        self.__wrapped__ = call

    def __get__(self, instance, owner):
        if instance is None:  # called on class
            return partial(self.__wrapped__, owner)
        else:                 # called on instance
            return partial(self.__wrapped__, instance)


class Foo:
    @anymethod
    def bar(first):
        print(first)

Foo.bar()    # <class '__main__.Foo'>
Foo().bar()  # <__main__.Foo object at 0x106f86610>