Python 如何在不创建实例的情况下选择性地访问类方法

Python 如何在不创建实例的情况下选择性地访问类方法,python,class,instance,Python,Class,Instance,我对python比较陌生,对OOP比较熟悉。我正在创建一个类来对数据执行一些基本方法,但理想情况下,我希望作为常规函数访问这些类方法,而不必首先创建实例 我为MyMethod设置了以下代码,其中包含一个方法“clip_sphere”,该方法将xyz坐标作为数组,并返回以“center”为中心、半径为“radius”的球体内的坐标 将numpy导入为np 类别MyMethod: 定义初始化(self,xyz): self.xyz=xyz def夹球(自身、中心、半径): self.xyz=self

我对python比较陌生,对OOP比较熟悉。我正在创建一个类来对数据执行一些基本方法,但理想情况下,我希望作为常规函数访问这些类方法,而不必首先创建实例

我为MyMethod设置了以下代码,其中包含一个方法“clip_sphere”,该方法将xyz坐标作为数组,并返回以“center”为中心、半径为“radius”的球体内的坐标

将numpy导入为np
类别MyMethod:
定义初始化(self,xyz):
self.xyz=xyz
def夹球(自身、中心、半径):
self.xyz=self.xyz-np.数组(中间)。重塑(1,-1)
r=(np.sum(self.xyz**2,轴=1))**0.5
idx=r<半径
xyz_clip=self.xyz[idx,:]
self.clip=xyz_clip
返回xyz_剪辑
我想做的是能够以两种方式运行clip sphere,wither by 1:

C=MyMethod(xyz)
xyz_clip=C.clip_球体(中心=[0,0,0],半径=2)
或者简单地将其作为函数调用,如:

xyz\u clip=clip\u球体(xyz,中心=[0,0,0],半径=2)
最好不作为普通函数重写。这可能与一些装饰师有关吗?或者这是可能的

编辑:在浏览了一些答案之后,我想我要问的是如何得到一个函数,比如numpy REFORMATE。因为这通过允许以下语句来实现:

a = np.reshape(np.array([1,2,3]),[3,1])
a=np.重塑(np.数组([1,2,3]),[3,1])
这就像一个函数 以及:

a = np.array([1,2,3]) 
a.reshape([3,1])
a=np.array([1,2,3])
a、 重塑([3,1])

它的作用类似于类方法

看起来您想要的是独立函数,而不是类/对象:

def clip_sphere(xyz, center, radius):

    xyz = xyz - np.array(center).reshape(1,-1)
    r = (np.sum(xyz**2, axis = 1))**0.5
    idx = r < radius

    xyz_clip = xyz[idx,:]
    clip = xyz_clip

    return xyz_clip
def clip_球体(xyz,中心,半径):
xyz=xyz-np.数组(中间).重塑(1,-1)
r=(np.和(xyz**2,轴=1))**0.5
idx=r<半径
xyz_clip=xyz[idx,:]
clip=xyz_clip
返回xyz_剪辑

您可以创建一个名为
clip\u sphere()的全局函数。

但是这样做让我想知道你为什么需要上课。从这里我可以看出,创建一个
Sphere
类可能更有意义。这显然是一个具有某些属性的对象:
radius
center
。然后,您可以添加
clip()
方法来执行您想要的操作:

class Sphere:
   def __init__(center, radius):
      self.center = center
      self.radius = radius

   def clip(x, y, z):
      # code goes here
对编辑的答复: 在浏览了一些答案之后,我想我要问的是如何得到一个函数,比如numpy REFORMATE。因为这通过允许以下语句来实现:

a = np.reshape(np.array([1,2,3]),[3,1])
其作用类似于函数,并且:

a = np.array([1,2,3]) 
a.reshape([3,1])

这是两个不同的函数,而不是调用同一函数的两种不同方式。

这是一种内置函数-您只需从类的命名空间中获取函数:

C = MyMethod(xyz)
xyz_clip = MyMethod.clip_sphere(C, center =[0,0,0], radius = 2)
但是,这仍然要求您拥有该类的实例。问题在于,编写代码是为了查找特定命名对象(名为
self
的对象)中的
xyz
等属性。(Python中的名称
self
没有什么特别之处,超出了常规。)

如果您确实需要能够使用
xyz
实现此功能,那么明智的做法是只编写一个简单的函数来处理它:

# At top level
def clip(xyz, center, radius):
    xyz -= np.array(center).reshape(1,-1)
    r = (np.sum(xyz**2, axis = 1))**0.5
    idx = r < radius
    return xyz[idx,:]

记住描述符是如何工作的,您可以对正确编写的
clip\u sphere
方法进行一个小修改,使您可以将该方法作为方法运行,或者作为接受坐标作为第一个参数的
classmethod
运行:

def clip_sphere(self, center, radius):
    xyz = self.xyz if isinstance(self, __class__) else self
    xyz -= np.array(center).reshape(1,-1)
    r = (np.sum(self.xyz**2, axis = 1))**0.5
    idx = r < radius
    xyz_clip = self.xyz[idx,:]
    if isinstance(self, __class__):
        self.clip = xyz_clip
        self.xyz = xyz
    return xyz_clip
或者作为
类方法

>>> MyMethod.clip_sphere(xyz, ...)

xyz\u clip=Myethod(xyz).clip\u sphere(center=[0,0,0],radius=2)
“我想作为常规函数访问这些类方法,而不必先创建实例。”然后这些应该是常规函数,而不是类method@Code-学徒。或者,当您有一些“对象”或“事物”具有可以通过调用函数修改或使用的状态时,通常使用ClassMethod面向对象编程。例如,您可以创建一个
球体
类,该类具有
半径
中心
。您在这里所做的似乎根本不需要类。那么静态方法呢?此方法是大型类的一部分,有许多其他方法都适用于该特定类,但我希望可以在独立数据(在本例中为xyz)上快速使用此方法(或其他方法)无需创建类实例,无需复制/粘贴或定义您在此处创建的另一个函数,如clip_sphere_func。如果您能准确地解释为什么要首先编写类,这会有所帮助。您希望它能给您带来什么,而不仅仅是在独立数据上调用函数?这个类在概念上代表什么?这是我试图创建的更大类中的一个简单方法。但是,在不创建实例的情况下访问独立数据(xyz)上的某些函数会很方便。只是想知道这是不是可以不重写为另一个function@AlecDay不,不可能调用这些方法,因为它们没有类的实例。正如其他人指出的,
self
参数必须是类的实例。您可以将其设置为
@classmethod
@staticmethod
,但不再可以访问
self.xyz
或其他字段。我想我想知道,像numpy.reformate这样的方法是如何工作的,它既允许
a=np.reformate(np.array([1,2,3]),[3,1])语句,又允许
a=np.array([1,2,3]),a.reformate语句([3,1])
@AlecDay在这种情况下,有两个名为
restrape()
的函数。一个在
numpy
模块中。另一个在
array
类中。因此,您不是以两种不同的方式调用同一个函数。而是调用两个不同的函数。这确实是更明智的方法。不确定
>>> MyMethod.clip_sphere(xyz, ...)