多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Python 类 和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。 Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。 对象可以包含任意数量和类型的数据。 ## 类定义 语法格式如下: ``` class ClassName: <statement-1> . . . <statement-N> ``` 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。 ## 类对象 类对象支持两种操作:属性引用和实例化。 属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。 类对象创建后,类命名空间中所有的命名都是有效属性名。所以如果类定义是这样: ``` class MyClass: """A simple example class""" i = 12345 def f(self): return 'hello world' ``` 实例化类: ``` x = MyClass() ``` 以上创建了一个新的类实例并将该对象赋给局部变量 x,x 为空的对象。 很多类都倾向于将对象创建为有初始状态的。因此类可能会定义一个名为 __init__() 的特殊方法(构造方法),像下面这样: ``` def __init__(self): self.data = [] ``` 类定义了 __init__() 方法的话,类的实例化操作会自动调用 __init__() 方法。所以在下例中,可以这样创建一个新的实例: ``` x = MyClass() ``` 当然, __init__() 方法可以有参数,参数通过 __init__() 传递到类的实例化操作上。例如: ``` >>> class Complex: ... def __init__(self, realpart, imagpart): ... self.r = realpart ... self.i = imagpart ... >>> x = Complex(3.0, -4.5) >>> x.r, x.i (3.0, -4.5) ``` ## 类的方法 在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数: ``` #类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s is speaking: I am %d years old" %(self.name,self.age)) p = people('tom',10,30) p.speak() ``` ## 继承 Python 同样支持类的继承,如果一种语言不支持继承就,类就没有什么意义。派生类的定义如下所示: ``` class DerivedClassName(BaseClassName1): <statement-1> . . . <statement-N> ``` 需要注意圆括号中基类的顺序,若是基类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找基类中是否包含方法。 BaseClassName(示例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用: ``` class DerivedClassName(modname.BaseClassName): ``` ### 实例 ``` #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函 people.__init__(self,n,a,w) self.grade = g #覆写父类的方法 def speak(self): print("%s is speaking: I am %d years old,and I am in grade %d"%(self.name,self.age,self.grade)) s = student('ken',20,60,3) s.speak() ``` ## 多重继承 Python同样有限的支持多继承形式。多继承的类定义形如下例: ``` class DerivedClassName(Base1, Base2, Base3): <statement-1> . . . <statement-N> ``` 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。 ``` #另一个类,多重继承之前的准备 class speaker(): topic = '' name = '' def __init__(self,n,t): self.name = n self.topic = t def speak(self): print("I am %s,I am a speaker!My topic is %s"%(self.name,self.topic)) #多重继承 class sample(speaker,student): a ='' def __init__(self,n,a,w,g,t): student.__init__(self,n,a,w,g) speaker.__init__(self,n,t) test = sample("Tim",25,80,4,"Python") test.speak()#方法名同,默认调用的是在括号中排前地父类的方法 ``` ## 类私有方法 __private_method 两个下划线开头,声明该方法为私有方法,不能在类地外部调用。 在类的内部调用slef.__private_methods。 类的专有方法: * __init__ 构造函数,在生成对象时调用 * __del__ 析构函数,释放对象时使用 * __repr__ 打印,转换 * __setitem__按照索引赋值 * __getitem__按照索引获取值 * __len__获得长度 * __cmp__比较运算 * __call__函数调用 * __add__加运算 * __sub__减运算 * __mul__乘运算 * __div__除运算 * __mod__求余运算 * __pow__称方 更多介绍请查看:[http://www.w3cschool.cc/python/python-object.html](/python/python-object.html)