Python类继承实例 python类继承关系学习

发布时间:2019-07-16编辑:脚本学堂
本文介绍了python类继承的几个例子,Python中的静态方法和静态成员,Python中多态性和抽象类的概念,需要的朋友参考下。

python类继承实例教程

内建函数issunclass和isinstance,可用来判断一个类是否派生自另一个类,并判断一个值是特定类的一个对象,函数那个类的一个子类。

1,python类和继承 
 

复制代码 代码示例:
import math 
#class Point 
 
class Point: 
    def __init__(self, xValue, yValue): 
        self.X = xValue 
        self.Y = yValue 
 
#class Circle 
class Circle(Point): 
    def __init__(self, xValue, yValue, rValue): 
        Point.__init__(self, xValue, yValue) 
        self.Radious = rValue 
 
    def area(self): 
        return math.pi * self.Radious ** 2  
 
#driver 
print("Point bases:", Point.__bases__) 
print("Circle bases:", Circle.__bases__) 
 
print("Circle is the subclass of Point:", issubclass(Circle, Point)) 
print("Point is the subclass of Circle:", issubclass(Point, Circle)) 
 
point = Point(3, 4) 
circle = Circle(4, 5, 2) 
 
print("point is an instace of Point:", isinstance(point, Point)) 
print("circle is an instace of Point:", isinstance(circle, Point)) 
 
print("point members:", point.__dict__) 
print("circle members:", circle.__dict__) 
 
print("the area if circle is:", circle.area()) 

设计原则:抽象类不应该拥有构造函数
引起的原因:
一个公共抽象类型拥有一个公共的构造函数
描述:
构造函数被用来建立一个对象实例,但是你不能建立一个抽象类型的实例,抽象类型的构造函数就仅仅能够被它的继承类型使用。因此,为一个抽象类构造公共构造函数是一个错误的设计。
修复:
如果需要修复这个问题,可以声明这个构造函数为保护型,或者,声明这个类型不是一个抽象类型。

一个类需不需要构造函数要看具体情况,和是不是抽象类(虚基类)没有关系。
一个类格构造函数的作用是对其成员进行初始化,抽象类也有可能包含需要初始化的成员,也需要进行初始化。(脚本学堂 www.jb200.com 收集整理)
初始化可以在基类的构造函数中进行,也可以在派生类的构造函数中进行。如果没有定义构造函数,编译器会自动生成缺省的复制型构造函数。我个人的看法是,不管在什么情况下都应该尽量抛开编译器的因素,自己编写构造函数。
造函数没有必要写成虚函数,编译器会自动调用父类的构造函数。而析构函数则不同,一般应该写成虚函数。

二,Python中也有多态性和抽象类的概念 
Python2.2以后,类和类型变成一个概念了 
 

复制代码 代码示例:
#覆盖父类的同名方法 
#class Employee 
class Employee: 
    def __init__(self, firstName, lastName): 
        self.firstName = firstName 
        self.lastName = lastName 
    def __str__(self): 
        return "%s %s" % (self.firstName, self.lastName) 
 
#class HourlyWorker 
class HourlyWorker(Employee): 
    def __init__(self, firstName, lastName, initHours, initWages): 
        Employee.__init__(self, firstName, lastName) 
        self.initHours = float(initHours) 
        self.initWages = float(initWages) 
 
    def __str__(self): 
        return "%s is an hourly worker with pay of %.2f" % / 
               (Employee.__str__(self), self.getPay()) 
 
    def getPay(self): 
        return self.initHours * self.initWages 
 
#main program 
hourlyworker = HourlyWorker("wang", "yang", 7.5, 20) 
print("Calling __str__ setval ways: ") 
print(hourlyworker) #隐式调用 
print(hourlyworker.__str__()) #显式调用 
print(HourlyWorker.__str__(hourlyworker)) #显式未绑定调用

三,Python中的静态方法和静态成员
使用内建方法staticmethod创建静态方法
 

复制代码 代码示例:
#Pthon中静态方法和静态成员示例 
class Employee: 
    '''static method and static member''' 
    numberOfEmployees = 0 
    maxEmployees = 10 
 
    def isCrowded(): 
        '''static method ''' 
        return Employee.numberOfEmployees > Employee.maxEmployees 
 
    #create static method 
    isCrowded = staticmethod(isCrowded) 
 
    def __init__(self, firstName, lastName): 
        self.first = firstName 
        self.last = lastName 
        Employee.numberOfEmployees += 1 
 
    def __del__(self): 
        '''Employee destructor''' 
        Employee.numberOfEmployees -= 1 
 
    def __str__(self): 
        return "%s %s" % (self.first, self.last) 
 
#main program 
def main(): 
        answers = ["NO", "YES"] 
        employeeList = [] 
        #class static method using class 
        print("Employees are isCrowed?") 
        print(answers[Employee.isCrowded()]) 
 
        print("creat 11 objects of class Employee") 
        for i in range(11): 
            employeeList.append(Employee("John", "Terry" + str(i))) 
 
        print("Employees are isCrowed?") 
        print(answers[Employee.isCrowded()]) 
 
        print("Remove one Employee..") 
        del employeeList[0] 
 
        print("Employees are isCrowed?/n", answers[Employee.isCrowded()]) 
 
if __name__  == "__main__": 
    main() 
 
__slots__类属性,可以用来限定只允许类的对象拥有的属性
__slots__用来规定对象的属性
#Simple class with slots 
class PointWithoutSlots: 
    def __init__(self, xValue=0.0, yValue=0.0): 
        self.x = float(xValue) 
        self.y = float(yValue) 
 
 
class PointWithSlots: 
     
    __slots__ = ["x", "y"] 
     
    def __init__(self, xValue=0.0, yValue=0.0): 
        self.x = float(xValue) 
        self.y = float(yValue) 
 
#main program 
def main(): 
    noSlots = PointWithoutSlots() 
    Slots = PointWithSlots() 
 
    for point in [noSlots, Slots]: 
        print("/n Processing an object of class", point.__class__) 
 
    print("The current value of point.x is %d" % (point.x)) 
 
    newValue = float(input("Enter new x Value:")) 
    print("Atemping to set new x Vlaue...") 
 
    point.X = newValue 
 
    print("the new value of point.x is%d" % (point.x)) 
 
if __name__ == "__main__": 
    main() 
 

四,Pytho中属性的概念。
通过函数property()来创建属性,这样就可以访问类的私有成员
 

复制代码 代码示例:
#property()属性的使用
class Point: 
    def __init__(self, xValue, yValue): 
        '''''私有属性,不能在外面访问''' 
        self.__x = xValue 
        self.__y = yValue 
    def setX(self, xValue): 
        self.__x = xValue 
    def getX(self): 
        return self.__x 
    x = property(getX, setX, "x") 
 
    def setY(self, yValue): 
        self.__y = yValue 
    def getY(self): 
        return self.__y 
    y = property(getY, setY, "y") 
 
point = Point(3, 5) 
print(point.x) 
point.x = 4 
print(point.x) 
 
print(point.y) 
point.y = 7 
print(point.y)