类的定义和使用
定义语法
Python 中使用 class 关键字来定义类,class关键字之后是一个空格,然后是类的名字,再后是一个冒号,最后换行并定类的内部实现。
例子
class Car:
def infor(self):
print("This is a car")
定义了类之后,可以用来实例化对象,并通过“对象名.成员”的方式来访问其中的数据成员或成员方法。
例子
class Car:
def infor(self):
print("This is a car")
car=Car()
car.infor()
python 提供了一个关键字 pass,表示空语句,可以用在函数和类的定义中或者选择结构、循环结构中。当暂时没有确定如何实现功能,或者为以后的软件升级预留空间时,可以使用该关键字来“占位”。
例子:
class A:
pass
def demo():
pass
if 5 > 3:
pass
self 参数
类的所有实例方法都必须至少有一个名为 self 的参数,并且必须是方法的第一个形参(如果有多个形参),self参数代表对象本身。在类的实例方法中访问实例属性时需要以self为前缀,但在外部通过对象名调用对象方法时并不需要传递这个参数,如果再外部通过类名调用对象方法则需要显式为 self 参数传值。
类成员与实例成员
这里主要指数据成员,或者广义上的属性。可以说属性有两种:一种时实列属性,另一种是类属性。实例属性一般是指在构造函数__init__() 中定义的,定义和使用时必须以 self 作为前缀;类属性是类中所有方法之外定义的数据成员。在主程序中(或类的外部),实例属性属于实例(对象),只能通过对象名访问;而类属性属于类,可以通过类名或对象名访问。
在python中可以动态的为类和对象增加成员。
例子:
class Car:
price = 10000 # 类属性
def __init__(self, c): # 实例属性
self.color = c
car1 = Car("red") # 实例化属性
car2 = Car("blue")
print(car1.color, Car.price)
Car.price = 1111111 # 修改类属性
Car.name = 'QQ' # 增加类属性
car1.color = 'yellow' # 修改实例属性
print(car2.color, Car.price, Car.name)
print(car1.color, Car.price, Car.name)
私有成员和公有成员
Python并没有对私有成员提供严格的访问保护机制。
在定义类的成员时,如果成员名以两个下划线“__”或更多下划线开头而不以两个或更多下划线结束则表示是私有成员。
私有成员在类的外部不能直接访问,需要通过调用对象的公有成员方法来访问,也可以通过Python支持的特殊方式来访问。
公有成员既可以在类的内部进行访问,也可以在外部程序中使用。
例子:
class A:
def __init__(self, value1=0, value2=0):
self._value1 = value1
self.__value2 = value2
def setValue(self, value1, value2):
self._value1 = value1
self.__value2 = value2
def show(self):
print(self._value1)
print(self.__value2)
a = A()
print(a._value1)
print(a._A__value2) # 在外部访问对象的私有数据成员
方法
在类中定义的方法可以粗略分为四大类:公有方法、私有方法、静态方法和类方法。
私有方法的名字以两个下划线“__”开始,每个对象都有自己的公有方法和私有方法,在这两类方法中可以访问属于类和对象的成员;
公有方法通过对象名直接调用,私有方法不能通过对象名直接调用,只能在属于对象的方法中通过self调用或在外部通过Python支持的特殊方式来调用。
如果通过类名来调用属于对象的公有方法,需要显式为该方法的self参数传递一个对象名,用来明确指定访问哪个对象的数据成员。
静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。
静态方法可以没有参数。
一般将cls作为类方法的第一个参数名称,但也可以使用其他的名字作为参数,并且在调用类方法时不需要为该参数传递值。
继承
继承是用来实现代码复用和设计复用的机制,是面向对象程序设计的重要特性之一。设计一个新类时,如果可以继承一个已有的设计良好的类然后进行二次开发,无疑会大幅度减少开发工作量。
在继承关系中,已有的、设计好的类称为父类或基类,新设计的类称为子类或派生类。
类继承语法规则:
class Subclass (SuperClass):
如果没有明确写明父类,则该类默认为Object的子类。所有的类都是通过直接或间接地继承object得到的。
支持多继承
class Subclass (SuperClassA, SuperClassB):
子类继承了父类,就继承了父类的方法和属性。
可以修改父类的状态或重载父类的行为
可以添加新的状态和行为。
关于继承的规则:
子类不能直接访问父类中私有的(private)的成员变量和方法。
1.子类不重写 init,实例化子类时,会自动调用父类定义的 init。
2.子类重写了父类的__init__ 时,实例化子类,就不会调用父类已经定义的__init__
3.如果子类重写了父类的__init__ 时,要继承父类的构造方法,可以使用 super 关键字
方法一:super(子类,self).init(参数1,参数2,…)
方法二:父类名称.init(self,参数1,参数2,…)