繁体   English   中英

如何在python中正确定义类的示例

[英]Example of how to properly define a class in python

我已经定义了一个函数:

def quicksort(points):
    if len(points) < 2: return points
    smaller,equal,larger = [], [], []
    pivot_angle = find_polar_angle(random.randint(0, len(points) - 1))
    for pt in points:
        pt_angle = find_polar_angle(pt)
        if pt_angle < pivot_angle:
            smaller.append(pt)
        elif pt_angle == pivot_angle: 
            equal.append(pt)
        else:
            larger.append(pt)
    return quicksort(smaller) + sorted(equal, key = find_dist) + quicksort(larger)

现在,我想将我的代码(顺便说一下,它是 Graham 扫描算法的实现)更改为面向对象的代码。 所以我继续在文件 MyClasses.py 中声明了一个类:

from MyFunctions import find_anchor, find_polar_angle, find_dist, find_det, quicksort, graham_scan

class Cluster:
    def __init__(self):
        self.members = []
        self.hull = []
        self.anchor = None

        self.find_anchor = find_anchor
        self.find_polar_angle = find_polar_angle
        self.find_dist = find_dist
        self.find_det = find_det
        self.quicksort = quicksort
        self.graham_scan = graham_scan

但当然我也必须改变我的功能。 我不想在这里列出所有功能,这就是为什么我仍然以quicksort功能为例。 这是我很挣扎的地方,因为我不太了解 python 语法,无法确定我在这里做什么。 这是我修改后的quicksort形式:

def quicksort(self, points):
    if len(points) < 2: return points
    smaller,equal,larger = [], [], []
    pivot_angle = self.find_polar_angle(self, random.randint(0, len(self.members) - 1))
    for pt in points:
        pt_angle = self.find_polar_angle(self, pt)
        if pt_angle < pivot_angle:
            smaller.append(pt)
        elif pt_angle == pivot_angle: 
            equal.append(pt)
        else:
            larger.append(pt)
    return self.quicksort(self, smaller) + sorted(self, equal, key = self.find_dist) + self.quicksort(self, larger)

事情是这样的:这个函数是递归的! 所以我需要它把smaller, equal and larger的参数作为参数。 稍后,另一个函数graham_scan将这样调用这个函数:

self.members = self.quicksort(self, self.members)

我知道这里可能有很多错误。 这就是为什么我要问:最后一个表达式是一个有效的表达式吗? 我的意思是我改变类变量( self.members ),但我通过直接改变它这样做,而是通过赋予它的返回值quicksort 无论如何,非常感谢帮助!

要将现有函数作为新类的新属性,请尝试以下操作:

def quicksort():
    pass # your custom logic

class Cluster:
    def __init__(self):
        self.members = []
        self.quicksort = quicksort
        # more properties

Python 的语法与 C++ 或 Java 完全不同。

关于第二个问题, quicksort函数体中使用的所有变量仅在该函数中可用。

关于第二个问题。 类的所有成员在 python 中都是PUBLIC 按照惯例,您可以在protected 和private 的名称前添加“_”和“__”。 但这并不阻止您访问它们,它只是意味着您(或任何阅读代码的人)不应滥用它们。 虽然, __variable 必须在类之外使用以下语法访问:

class Square:

    def __init__(self, x):
        self.__x = x

    def get_surface(self):
        return self.__x **2


>>> square1 = Square(5)
>>> print(square1.get_surface())
>>> 25
>>> square1._Square__x = 10
>>> print(square1.get_surface())
>>> 100


>>> square1.__x
>>> **AttributeError: 'Square' object has no attribute '__x'**

否则会引发 AttributeError。 希望这可以帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM