#python
#python
Вопрос:
Я новичок в программировании на Python. Теперь я столкнулся с проблемой, когда хочу вызвать некоторые результаты из одного класса в другой класс в качестве одного из __init__
атрибутов. Вот код, показанный ниже: (reduced_data — это числовые данные в векторе)
class A:
def __init__(self, k=3, tol=0.0001, max_iter=300):
self.k = k
self.tol = tol
self.max_iter = max_iter
def fit(self, data):
self.centroids = {}
for i in range(self.k):
self.centroids[i] = data[i 50]
for i in range(self.max_iter):
self.classifications = {}
for i in range(self.k):
self.classifications[i] = []
for featureset in data:
distances = [np.linalg.norm(featureset - self.centroids[centroid]) for centroid in self.centroids]
classification = distances.index(min(distances))
self.classifications[classification].append(featureset)
prev_centroids = dict(self.centroids)
for classification in self.classifications:
self.centroids[classification] = np.average(self.classifications[classification], axis=0)
optimized = True
for c in self.centroids:
original_centroid = prev_centroids[c]
current_centroid = self.centroids[c]
if np.sum((current_centroid - original_centroid) / original_centroid * 100.0) > self.tol:
#print(np.sum((current_centroid - original_centroid) / original_centroid * 100.0))
optimized = False
if optimized:
break
def cluster_labels(self,data):
cluster_labels = []
for featureset in data:
distances=[np.linalg.norm(featureset - self.centroids[centroid]) for centroid in self.centroids]
cluster_labels.append(distances.index(min(distances)))
return cluster_labels
class B:
x = np.linalg.norm(reduced_data-[1,1])
k = (x-5)^2
a = A()
a.fit(reduced_data)
y_pred = a.predict(reduced_data)
labels = a.cluster_labels(reduced_data)
В принципе, я хочу передать значение k в классе B в качестве атрибута класса A в def __init__(self, k=k in class B, tol=0.0001, max_iter=300):
И как я мог бы этого добиться?
Ответ №1:
Быстрый ответ: измените третью строку в классе B на: a = A(k=k)
.
Но задайте себе более фундаментальный вопрос. Почему «класс B» вообще является классом? Как вы написали, у него нет никаких свойств «self», поэтому у него нет сохраненного состояния. Вы вычисляете y_pred и метки ровно один раз. Это атрибуты класса. После этого они никогда не меняются. Я предлагаю вам просто исключить класс и поместить последние шесть строк в основную часть вашего кода.
Ответ №2:
Вы можете передать параметры из __init__
метода при создании нового экземпляра этого объекта.
Т.е. a = A(k)
.
Обратите внимание, что в классе B
код не находится внутри метода. Возможно, вы захотите поместить этот код за пределы определения класса. В Python код не обязательно должен находиться внутри класса.
Ответ №3:
У вашего класса A
нет атрибута k
, однако у его экземпляра есть.
Таким образом, вы должны либо создать k
атрибут класса A
, либо каждый раз передавать значение экземпляра A.k
в B
.