-1
class courseInfo(object):

    def __init__(self, courseName):
        self.courseName = courseName
        self.psetsDone = []
        self.grade = "No Grade"

    def setGrade(self, grade):
        if self.grade == "No Grade":
         self.grade = grade

    def getGrade(self):
        return self.grade


class abc(object):
    def __init__(self, courses):
        self.myCourses = []
        self.Pset = []
        self.grade = {}
        for course in courses:
            self.myCourses.append(courseInfo(course))

     def setGrade(self, grade, course="6.01x"):
        """
        grade: integer greater than or equal to 0 and less than or 
          equal to 100
        course: string 

        This method sets the grade in the courseInfo object named 
          by `course`.   

        If `course` was not part of the initialization, then no grade is 
          set, and no error is thrown.

        The method does not return a value.
        """

    def getGrade(self, course="6.02x"):
        """
        course: string 

        This method gets the grade in the the courseInfo object 
          named by `course`.

        returns: the integer grade for `course`.  
        If `course` was not part of the initialization, returns -1.
        """

xyz = abc( ["6.00x","6.01x","6.02x"] )
xyz.setGrade(100)

print xyz.getGrade(course="6.01x")
print Xyz.getGrade(course="6.02x")

問題は、Python で別の基本クラスからある基本クラスのメンバーにアクセスする方法です。ここで、さらにサブクラスを作成せずに、abc class から courseInfo クラスのメソッドにアクセスしますか?

4

4 に答える 4

0

あなたの質問はあまり明確ではありません。これは役に立ちますか?

class abc(object):

    def __init__(self, courses):
        [...]
        self.my_courses = {course_name: courseInfo(course_name) 
                           for course_name in courses}

    def setGrade(self, grade, course="6.01x"):
        course = self.my_courses[course]
        course.setGrade(grade)

    def getGrade(self, course="6.02x"):
        course = self.my_courses[course]
        return course.getGrade()

の代わりに、listあなたのコースを に保存dictして、名前で検索できるようにします。これを行う方法は他にもありますが、これはシンプルでエレガントです (そして、毎回リストを反復処理するよりも効率的です)。

于 2013-05-07T11:02:47.740 に答える
0

これは単純な構成のように見え、「基本クラスへのアクセス」とは関係ありません。属性coursesには、ユーザーのすべてのコースが含まれており、それぞれに独自のsetGradeメソッドがありgetGradeます。したがって、そのリスト内の関連するコースを特定し、そのメソッドを呼び出すだけです。何かのようなもの:

for c in self.myCourses:
    if c.courseName == course:
        c.setGrade(grade)

abcの構造とそのメソッドを制御できるかどうかはわかりませんが__init__、コースをリストではなく名前でキー付けされた辞書として保存すると、これは簡単になります。

于 2013-05-07T11:03:22.810 に答える
0

質問はこの形式であり、サブクラスをさらに作成せずにいずれかの基本クラスのメンバーにアクセスする方法を求めています

さて、すべてのcourseInfoinへの参照があるのでmyCourses、これを行うことができます:

def setGrade(self, grade, course="6.01x"):
    for i in self.myCourses:
        if i.courseName == course:
            i.setGrade(grade)

ただし、実際には適切な継承を行う必要があります。

于 2013-05-07T11:04:06.857 に答える
0

あなたは Python を書きながら C++ で書いたり考えたりしています。

たとえば、次のインスタンスがある場合、プログラムのどこでも次courseInfocいずれかを実行できます。

c.setGrade('a')
g = c.getGrade()

あるいは

c.grade = 'this is not really a grade'

クラス インスタンスのすべてのメンバーは「パブリック」であり、Python カプセル化は「ここではすべて大人です」という原則に基づいて機能するため、私が許可しない限り、私のプライベートには触れないでください。属性名の先頭にあるアンダースコアは、それが非公開属性であり、実際に触れてはならないことを警告するという別の規則があります。courseInfo持っている場合

self._grade - 'No Grade'

_gradeそうすれば、危険を冒してアクセスすることがわかります。これは実際には C++ にも当てはまります。これは難しく、キャストが含まれます。

self.__grade 後で別の方法で処理されると答える人もいるかもしれませんが、それは私的なものにはなりません。初心者としては、getter と setter が Java や C++ よりも Python ではるかに一般的ではない理由を理解するまで、構造を避けるのが最善です。

于 2013-05-07T10:53:43.987 に答える