class 的定义格式
class的组成
- 名称: 类名,注意其首字母需要大写
- 属性:一组数据
- 方法:能进行操作的方法
class书写的格式
class 类名:
类的属性
类的方法
注意缩进
class 成员与方法
数据成员和成员方法
数据成员:创建类时用变量的形式表示对象特征的成员
成员方法:用函数的形式表示对象行为的成员
二者统称:类的成员
私有成员和公有成员
私有成员:在类的外部不能直接访问,可在内部访问,形式上,两个下划线开头但是不以两个下划线结束则表示是私有成员,对象名._类名__xxx 也可以在外部程序中访问私有成员。 self.__name = “name” 这是类中私有成员的书写方式
公有成员:可以公共访问的成员
额外补充:
_xxx:受保护成员;
xxx:系统定义的特殊成员;
__xxx:私有成员,只有类对象自己能访问,子类对象不能直接访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样的特殊方式来访问。
成员方法、类方法、静态方法、抽象方法
方法一般指与特定实例绑定的函数,通过对象调用方法时,对象本身将被作为第一个参数自动传递过去,普通函数并不具备这个特点。
-
静态方法和类方法都可以通过类名和对象名调用,但不能直接访问属于对象的成员,只能访问属于类的成员。
-
静态方法和类方法不属于任何实例,不会绑定到任何实例,当然也不依赖于任何实例的状态,与实例方法相比能够减少很多开销。
-
类方法一般以cls作为类方法的第一个参数表示该类自身,在调用类方法时不需要为该参数传递值,静态方法则可以不接收任何参数。
-
抽象方法一般在抽象类中定义,并且要求在派生类中必须重新实现,否则不允许派生类创建实例。
类与对象的动态性、混入机制
python可以动态地为自定义类和对象增加或删除成员
python类型的动态性使得我们可以动态为自定义类及其对象增加新的属性和行为,俗称混入(mixin)机制
例如系统中的所有用户分类非常复杂,不同用户组具有不同的行为和权限,并且可能会经常改变。这时候我们可以独立地定义一些行为,然后根据需要来为不同的用户设置相应的行为能力。
代码:
import types
class person(object):#括号中是派生的其它基类,若有多个用逗号隔开
_counts = 0 #受保护的变量
def __init__(self, color, name):#这是构造方法,当创建类的(实例)对象时,会自动调用,从而实现对类进行初始化操作
#self类似java里面的this,代表对象自己。
#在类中的方法里self永远是第一个参数
self.url = "www.baidu.com"
self.color = color
self.__name = name
person.__name1 = "你好"
self.where = "china"
def get:#普通的实例方法
print(self.url)
self.url = "www.coonote.com"
def getur(self):
print(self.url)
def getname(self):
print(self.__name)
@classmethod #修饰器声明类方法
def classshow(cls):#类方法,cls默认为其方法的参数
print(cls._counts)
@staticmethod #修饰器,声明该方法为静态方法
def staticshow():
print(person.__name1)
def walk(self):
print(self.__name,"开始行走",self.where)
classforself = person(color="blue",name="nihao")
classforself.get
classforself.getur()
classforself._person__name = "外部访问"
classforself.classshow()
classforself.staticshow()
print(isinstance(classforself,object))
#动态的增改类的属性
person.url = "www.coonote.com"
classforself.get
结果:
www.baidu.com
www.coonote.com
0
你好
true
www.coonote.com
继承
-
继承是用来实现代码复用和设计复用的机制,是面向对象程序设计的重要特性之一。设计一个新类时,如果可以继承一个已有的设计良好的类然后进行二次开发,无疑会大幅度减少开发工作量。
-
在继承关系中,已有的、设计好的类称为父类或基类,新设计的类称为子类或派生类。派生类可以继承父类的公有成员,但是不能继承其私有成员。如果需要在派生类中调用基类的方法,可以使用内置函数super()或者通过“基类名.方法名()”的方式来实现这一目的。
-
python支持多继承,如果父类中有相同的方法名,而在子类中使用时没有指定父类名,则python解释器将从左向右按顺序进行搜索。
多态
-
所谓多态(polymorphism),是指基类的同一个方法在不同派生类对象中具有不同的表现和行为。派生类继承了基类行为和属性之后,还会增加某些特定的行为和属性,同时还可能会对继承来的某些行为进行一定的改变,这都是多态的表现形式。
-
python大多数运算符可以作用于多种不同类型的操作数,并且对于不同类型的操作数往往有不同的表现,这本身就是多态,是通过特殊方法与运算符重载实现的。
代码:
class animal(object):#基类
def show(self):
print("animal")
class dog(animal):#派生类
def __init__(self):
self.color = "blue"
def show(self):
print("this is a dog")
class hsqdog(dog):
def show(self):#覆盖基类的方法
print("这是二哈",self.color)
class cat(animal):
pass#没有覆盖基类的方法
if __name__ == "__main__":
dog =dog()
dog.show()
hsq = hsqdog()
hsq.show()
cat =cat()
cat.show()
f = [i() for i in (animal, cat, dog, hsqdog)]
for i in f:
i.show()
结果:
this is a dog
这是二哈 blue
animal
animal
animal
this is a dog
这是二哈 blue