Передача значений из разных классов в Python

#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 .