0

我是 Python 语言的新手。我只有10天的经验。当我开始学习时没有什么困难,但是当我到达“面向对象的概念”,尤其是“继承”时,它让我放慢了速度。

我的一些背景知识“继承是子类可以获得父类的所有特征和行为,换句话说 - 父类的数据和方法”。好的,我将展示使我与两个程序混淆的概念。他们都得到了相同的结果,所以为什么人们会做出不同的事情。

第一的:

class Parent():    
    parentdata = 0    
    def __init__(self):        
        pass    
    def getParentData(self):
        return Parent.parentdata
    def setParentData(self, setdata):
        Parent.parentdata = setdata



class Child(Parent):
    childdata = 0
    def __init__(self):
        pass
    def getChildData(self):
        return Child.childdata
    def setChildData(self, setdata):
        Child.childdata = setdata


child = Child()
print "Default Child's Data is :" + str(child.getChildData())#getting 0
child.setChildData(3)
print "After Adding Child's Data is :"+ str(child.getChildData()) # getting 3
print "Default Parent's Data is:"+ str(child.getParentData())# getting 0
child.setParentData(1)
print "After Adding Parent's Data is :"+str(child.getParentData())# getting 1

第二:

class Parent():
    parentdata = 0
    def __init__(self):
        pass
    def getParentData(self):
        return Parent.parentdata
    def setParentData(self, setdata):
        Parent.parentdata = setdata

class Child(Parent):
    childdata = 0
    def __init__(self):
        #super(Child, self).__init__()
        #super(Child, self).__init__(self, self)
        Parent.__init__(self)
    def getChildData(self):
        return Child.childdata
    def setChildData(self, setdata):
        Child.childdata = setdata
child = Child()
print "Default Child's Data is :" + str(child.getChildData())#getting 0
child.setChildData(3)
print "After Adding Child's Data is :"+ str(child.getChildData()) # getting 3
print "Default Parent's Data is:"+ str(child.getParentData())# getting 0
child.setParentData(1)
print "After Adding Parent's Data is :"+str(child.getParentData())# getting 1

也请指导我,如何使用Super()方法,例如Parent.__init__(self) Somebody used, Super method in there 和 some are doing as my way。我不清楚这两种不同。

在这两个程序中 - 我没有__init__用作构造函数。如果我要使用__init__as 将数据添加到类的数据(子数据,父数据)中,我如何在Parent.__init__(self)它们的def __init__(self):方法中插入参数?

4

1 回答 1

1

您的示例似乎按预期运行。您已经使用类级别数据设置了两个类——也就是说,每个父级将共享相同的 parentData 值,每个子级将共享相同的 childData 值。由于您的方法名称未共享,因此您的“子”实例的行为将独立于“父”,除非在子上调用 setParentData 会将值推送到所有父的状态 - 但不是所有子的状态。

更常见的示例如下所示:

class Parent(object):
     shared_state = 0

     def __init__(self):
         self.private_state = 1

     def get_shared(self):
         return self.shared_state

     def get_private(self)
         return self.private_state

class Child(Parent):
    shared_state = 2

    def __init__(self):
        Parent.__init__(self)
        self.private_state = 3 
        #in this case calling the Parent constructor is not really needed but it's good practice


 p = Parent()
 p.get_shared()
 > 0
 p.get_private()
 > 1

 new_p = Parent()
 new_p.get_shared()
 > 0


 c = Child()
 c.get_shared()
 > 2
 c.get_private()
 > 3

在这个例子中,所有的父母共享变量“shared_state”——但每个人都有自己的 private_state 副本,独立于其他父母。同样,每个 Child 共享 Child 的 shared_state 的副本——这与 Parent 的共享状态不同。

本质上,当子类中出现相同的名称(对于类变量,如 shared_state)或方法(如 get_private 或 get_shared)时,它会覆盖原始版本。这就是为什么在 Child 上调用 get_shared() 会返回 2,即 Child.shared_state。在您的原始代码中,您从 Chold 显式调用 Parent.parentData,因此您从 Parent 获得了值。

继承背后的核心思想是让共享通用功能变得容易,并且只针对特定需求编写新的类或方法:

class Vehicle(object):
    def __init__(self, name, passengers):
       self.Passengers = passengers
       self.Name = name

    def go(self):
       print "%n is going with  %i passengers" % (self.Name, self.Passengers)

    def get_name(self):
       print self.Name

class Car(Vehicle):
    def go(self):
       print "%n is driving along with  %i passengers" % (self.Name, self.Passengers)

class Boat(Vehicle):
    def go(self):
       print "%n is sailing along with  %i passengers" % (self.Name, self.Passengers)

class Truck(Car):
    def deliver(self):
        print "%n is delivering cargo" % self.Name

在这里,子类都可以“运行”,但它们以不同的方式进行——好处是使用它们的代码不需要知道它们是什么,它只是调用它们,它们以自己的方式运行。卡车像汽车一样“行驶”,并且有一种船和汽车没有的交付方法。所有的类都共享“get_name”方法,因此不必重写——它在所有派生类中都是免费的。因此,如您所见,您可以共享函数和数据,将它们替换为具有相同名称的不同函数或数据(因此外部代码可以以相同的方式获取它们)或添加新函数和数据。

您可能想查看Head First Python以更全面地介绍这些想法。当然,这里有很多关于 SO 的内容。

于 2013-01-19T07:36:15.447 回答