python ood - 类

时间:2015-08-17 08:31:36

标签: python

我正在尝试使用Member类和Guest类来表示组成员身份。问题是我需要一个小组能够告诉我哪些会员是该小组的成员,但我还需要一位会员能够告诉我它所属的小组。

例如,使用以下内容:

class Member:
    MemberCount = 0

    def __init__(self, name):
        self.name = name
        self.MemberID = Member.MemberCount
        Member.MemberCount += 1

    def displayMember(self):
        print "Member ID %d" % self.MemberID
        print "Member name %s" % self.name

class Group:
    groupCount = 0

    def __init__(self, name):
        self.name = name
        self.MemberList = []
        self.groupID = Group.groupCount
        Group.groupCount += 1

    def addMember(self, Member):
        self.MemberList.append(Member)

    def displayGroup(self):
        print "Group ID %d" % self.groupID
        print "Group name %s" % self.name
        print "This group contains the following members"
        for i in self.MemberList:
            print i.name,
            print "\n"

#Create some members
member1 = Member("Tim")
member2 = Member("Bill")
member3 = Member("Jack")
member4 = Member("Julian")
member5 = Member("Alex")

#Create some groups
group1 = Group("Golf Club")
group2 = Group("Shooting Club")
group3 = Group("Swimming Club")

#Add the members to groups
group1.addMember(member1)
group1.addMember(member2)
group1.addMember(member3)

group2.addMember(member3)
group2.addMember(member4)
group2.addMember(member5)

group3.addMember(member1)
group3.addMember(member2)
group3.addMember(member5)

#Display the groups' members
group1.displayGroup()
group2.displayGroup()
group3.displayGroup()

我得到以下输出:

Group ID 0  
Group name Golf Club  
This group contains the following members  
Tim Bill Jack 

Group ID 1  
Group name Shooting Club  
This group contains the following members  
Jack Julian Alex 

Group ID 2  
Group name Swimming Club  
This group contains the following members  
Tim Bill Alex 

其中显示了每个组中的成员,但如果我想显示每个成员所属的组,那么我需要向列出其组的每个guest添加一个列表,所以看起来我会存储相同的信息两次,但只是以不同的形式。

我如何知道哪些成员是某个成员的成员以及成员所属的哪些成员而不重复这些信息?

2 个答案:

答案 0 :(得分:1)

首先,请考虑使用常见的编码风格,例如:在开始时用大写字母写所有类,用小写字母写所有对象。编写代码的方式令人困惑,因为您的对象具有与类相同的名称。 (有关详情,请参阅https://www.python.org/dev/peps/pep-0008/

现在问题。你基本上有两种解决方法:

1。 将组添加到Group.addMember中的每个成员,如

// Group
def addMember(self, member):
    self.memberList.append(member)
    member.groups.append(self)
然而,这具有非常紧密耦合的缺点。对于垃圾收集,您必须取消链接对象。删除成员也需要您从成员列表中删除该成员,并从该成员的组列表中删除该组。

2。 做反向查询。而不是向成员询问他所在的团体,而是询问每个团体成员是否在其中。您可以使用以下成员的方法进行查询:

// Member
def getGroups(self):
    groups = []
    for group in globalGroups:
        if self in group.MemberList:
            groups.append(group)
    return groups;

答案 1 :(得分:0)

  

如果我想展示每个成员所属的团体,那么我会   需要为列出其组的每个客户添加一个列表,所以它   似乎我会存储两次相同的信息,但只是在   不同的形式。

     

我如何知道哪些成员是组的成员?   一个成员所属的团体是不是重复信息的一部分?

您描述的不是重复信息。每个成员都有一个列表可以指示它们所在的组,并且同时每个组都有一个列表来指示它所拥有的成员。它不是同一个列表,它是不同的信息。

你还应该记住的是分离关注点 你可以实现一个类或一些可以跟踪所有内容,所有成员和所有组的东西,这样你就可以在一个地方拥有所有数据而不需要“重复”列表,但这不会那么整洁。

如果你真的不希望每个成员拥有自己的组列表,你可以(在你的例子中)只创建一个遍历组的函数并检查它们是否为某个成员

def getGroupsForMember(member):
  groups = []
  for group in [group1, group2, group3]:
    if member in group.MemberList:
      groups.append(group.groupID)
  return groups