1.面向对象和面向过程的区别
以下五子棋为例:
2.类和实例
(1)类是抽象的模板,实例是根据模板创建出来的具体的对象
(2)比如人类就是一个类,刘亦菲就是人类的一个实例
2.1 新建类和类的实例化
class 类名:
def 方法名():
代码
初始化方法不负责创建对象,而是给对象赋予初始值。创建对象是构造方法做的
普通的类方法都有self,所有带有self的属性或方法,代表可以共用。也就是实例本身
class Rectangle:
def __init__(self,length,width):
self.length=length#将用户传的length作为长方形自身的length
self.width=width#将用户传的width作为长方形自身的width
def perimeter(self):
return (self.length+self.width)*2
def area(self):
return self.length*self.width
rec=Rectangle(6,4)#实例化为一个长为6宽为4的长方形
print(rec.perimeter())
print(rec.area())
2.2 实例方法、静态方法和类方法
2.2.1实例方法
类里面的方法是实例方法,不能由类调用,需要先实例化对象,之后由实例对象调用
class Rectangle:
def __init__(self,length,width):
self.length=length#将用户传的length作为长方形自身的length
self.width=width#将用户传的width作为长方形自身的width
def perimeter(self):
return (self.length+self.width)*2
def area(self):
return self.length*self.width
rec.perimeter()#实例调用方法
Rectangle.perimeter()//这样会报错
2.2.2 类方法
有时需要使用可以由类调用的方法,可以使用@classmethod装饰器,声明某个方法是类方法
类方法:类和实例都可以调用,类方法可以调用类属性,不能调用self的属性
类属性:定义在类里,不能定义在__init__里,否则类不能调用,只能实例调用。
装饰器:待补充
class Rectangle:
color='red'# 类的属性
def __init__(self,length,width):
self.length=length#将用户传的length作为长方形自身的length
self.width=width#将用户传的width作为长方形自身的width
def perimeter(self):
return (self.length+self.width)*2
@classmethod
def features(cls):
print("两边长相等,两边宽相等,长和宽的角度是90度")
print('颜色是',cls.color)#不能调用self.width
rec=Rectangle(6,4)#实例化为一个长为6宽为4的长方形
Rectangle.features()//类调用
rec.features()//实例调用
2.2.3 静态方法
静态方法可以由类调用
class Rectangle:
color='red'# 类的属性
def __init__(self,length,width):
self.length=length#将用户传的length作为长方形自身的length
self.width=width#将用户传的width作为长方形自身的width
def perimeter(self):
return (self.length+self.width)*2
def area(self):
return self.length*self.width
@classmethod
def features(cls):
print("两边长相等,两边宽相等,长和宽的角度是90度")
print('颜色是',cls.color)
@staticmethod
def sumdata(a,b):
return a+b
print(Rectangle.sumdata(1,2))
3.类的继承
继承是从已有的类中派生出新的类,新的类可以使用已有类的属性和行为,并扩展新的能力
比如小学生是学生的子类,有学生的共有特征,也有小学生的自有特征
3.1完全继承
子类不做任何改变,完全继承父类的所有属性和方法
class Rectangle:
color='red'# 类的属性
def __init__(self,length,width):
self.length=length#将用户传的length作为长方形自身的length
self.width=width#将用户传的width作为长方形自身的width
def perimeter(self):
return (self.length+self.width)*2
def area(self):
return self.length*self.width
@classmethod
def features(cls):
print("两边长相等,两边宽相等,长和宽的角度是90度")
print('颜色是',cls.color)
@staticmethod
def sumdata(a,b):
return a+b
#完全继承
class Square(Rectangle):
pass
square=Square(6,6)
print(square.area())
3.2 部分继承
class Rectangle:
color='red'# 类的属性
def __init__(self,length,width):
self.length=length#将用户传的length作为长方形自身的length
self.width=width#将用户传的width作为长方形自身的width
def perimeter(self):
return (self.length+self.width)*2
def area(self):
return self.length*self.width
@classmethod
def features(cls):
print("两边长相等,两边宽相等,长和宽的角度是90度")
print('颜色是',cls.color)
@staticmethod
def sumdata(a,b):
return a+b
//部分继承,重写部分父类方法
class Squre1(Rectangle):
def __init__(self,side):
self.length=side
self.width=side
square=Squre1(6)
print(square.area())
3.3 继承并追加super()
class Rectangle:
color='red'# 类的属性
def __init__(self,length,width):
self.length=length#将用户传的length作为长方形自身的length
self.width=width#将用户传的width作为长方形自身的width
def perimeter(self):
return (self.length+self.width)*2
def area(self):
return self.length*self.width
@classmethod
def features(cls):
print("两边长相等,两边宽相等,长和宽的角度是90度")
print('颜色是',cls.color)
#继承并追加
class Square2(Rectangle):
def __init__(self,side):
self.length=side
self.width=side
@classmethod
def features(cls):
super().features()//先继承父类的features方法
print("长和宽相等")//再新增自己的东西
square=Square2(6)
square.features()
3.4Object
所有类都是object的子类,无论是否声明继承,实际都继承了object
class Class1(object):
pass
两种写法是效果一样的
class Class:
pass
print(Class1.__dict__)
print(Class1.__doc__)
print(Class1.__name__)
3.5多继承
- 一个父类可以有多个父类
- 父类中有同名方法时,按继承顺序调用先继承的
水路两通汽车:既有水性又可以路上跑
#多继承
class Money1:
def money1(self):
print('一个亿')
class Money2:
def money2(self):
print('两个亿')
class Human(Money1,Money2):
pass
man=Human()
man.money1()
man.money2()