Пример того, как правильно определить класс в python - PullRequest
0 голосов
/ 11 февраля 2020

Я определил функцию как таковую:

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)

Теперь я хочу изменить свой код - кстати, это реализация алгоритма сканирования Грэма - на объектно-ориентированный код. Поэтому я пошел дальше и объявил класс в файле 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. В любом случае, помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 11 февраля 2020

О втором вопросе. Все члены классов ПУБЛИ C в python. По соглашению вы можете добавить «_» и «__» перед именами для защищенных и конфиденциальных. НО это не мешает вам получить к ним доступ, это просто означает, что вы (или тот, кто читает код) не должны злоупотреблять ими. Хотя, __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. Надеюсь, это поможет

0 голосов
/ 11 февраля 2020

Чтобы сделать существующую функцию новым свойством нового класса, попробуйте следующее:

def quicksort():
    pass # your custom logic

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

Python имеет совершенно другой синтаксис C ++ или Java.

Что касается второго вопроса, все переменные, используемые в quicksort теле функции, доступны только в этой функции.

...