类和对象:
类和对象是面向对象编程的核心
定义类:
class type:
或者
class type(object)
定义对象:
class Animal:#定义类
def move(self):
print('动物在奔跑')
p=Animal()#创建对象
p.move()#调用对象
p.name='狮子'#赋予对象属性
print(p.name)
输出
动物在奔跑
狮子
封装:
>>> list1=[2,5,6,9,0]
>>> list1.sort()
>>> list1
[0, 2, 5, 6, 9]
>>> list1.append(8)
>>> list1
[0, 2, 5, 6, 9, 8]
关于python的魔方方法:
#__init__(每边两个下划线)
class Name:
def __init__(self,name):
self.name=name
def answer(self):
print('我叫%s'%self.name)
a=Name('carrot')
a.answer()
输出
我叫carrot
普通定义
>>> class Name:
def setName(self,name):
self.name=name
def answer(self):
print('我叫%s'%self.name)
>>> a=Name()
>>> a.setName('carrot')
>>> a.answer()
我叫carrot
继承:
单类继承
>>> class list1(list):
pass
>>> list2=list1()
>>> list2.append(8)
>>> list2.insert(0,9)
>>> list2
[9, 8]
多类继承
class people:
def __init__(self,name,age):
self.name=name
self.age=age
def ages(self):
print('{}今年{}岁'.format(self.name,self.age))
class Love:
def __init__(self,name,age):
self.name=name
self.age=age
def love(self,loves):#注意这里,如果不加self的话,会报错:take 1 positional argument but 2 were given
#因为在类调用类内部函数是,会自动传入self参数,所以传递参数是(self,loves)而若只有一个参数(self)就会报错
print('爱{}'.format(loves))
class Answer(people,Love):
def __init__(self,name,age):
self.name=name
self.age=age
answer=Answer('carrot',20)
answer.ages()
answer.love('吃东西')
输出
carrot今年20岁
爱吃东西
多类继承使用不当会导致重复调用(也叫钻石继承、菱形继承)的问题:
class A():
def __init__(self):
print("进入A...")
print("离开A...")
class B(A):
def __init__(self):
print("进入B...")
A.__init__(self)
print("离开B...")
class C(A):
def __init__(self):
print("进入C...")
A.__init__(self)
print("离开C...")
class D(B, C):
def __init__(self):
print("进入D...")
B.__init__(self)
C.__init__(self)
print("离开D...")
d = D()
输出
进入D...
进入B...
进入A...
离开A...
离开B...
进入C...
进入A...
离开A...
离开C...
离开D...
这里A就被前后进入了两次
多态:
class A:
def f(self):
print('输出A')
class B:
def f(self):
print('输出B')
a=A()
b=B()
a.f()
b.f()
输出
输出A
输出B
如果不希望对象的属性或方法被外部直接引用,可以在属性或方法名字前边加上双下划线
>>> class a:
__name = 'carrot'
def get(self):
return self.__name
>>> p=a()
>>> p.__name
Traceback (most recent call last):
File "<pyshell#78>", line 1, in <module>
p.__name
AttributeError: 'a' object has no attribute '__name'
>>> p.get()
'carrot'
>>> class a:
name = 'carrot'
def get(self):
return self.name
>>> p=a()
>>> p.name
'carrot'
编程题1:定义一个矩形类并生成类实例对象,要求可以求矩形面积
class Rectangle:
def setRect(self):
self.width=float(input('长设置为:'))
self.length=float(input('宽设置为:'))
def getRect(self):
print('这个矩形的长为:%.2f,宽为:%.2f'%(self.width,self.length))
def getArea(self):
a=self.width*self.length
print('面积为:%.2f'%a)
s=Rectangle()
s.setRect()
s.getRect()
s.getArea()
输出
长设置为:5
宽设置为:2
这个矩形的长为:5.00,宽为:2.00
面积为:10.00
编程题2:定义一个点(Point)类和直线(Line)类,使用getlen方法获得直线的长度
import math#调用math模块
class Point():
def __init__(self,x,y):
self.x=x
self.y=y
def getX(self):
return self.x
def getY(self):
return self.y
class Line():
def __init__(self,x,y):
self.x= p1.getX()-p2.getX()
self.y= p1.getY()-p2.getY()
self.length=math.sqrt(self.x*self.x+self.y*self.y)#调用math模块的sqr函数
def getline(self):
return self.length
p1=Point(1,4)
p2=Point(2,6)
line=Line(p1,p2)
print('%.2f'%line.getline())
输出
2.24