[英]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.