1.面向对象基础:类和实例的概念
1.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=Rectangle(5,4) #实例化
print(rec.__dict__) #查看实例的属性
print(rec.perimeter())
print(rec.area())
2.面向对象进阶
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
@classmethod #装饰器,声明下面的方法是类方法
def features(cls):
print('两边的长相等,两边的宽也相等,长和宽的角度为90度')
@staticmethod #装饰器,声明下面的方法是静态方法
def sumdata(a, b): #静态方法
return a + b
2.1调用实例方法,类方法,静态方法
rec=Rectangle(5,4) #实例化
print(rec.perimeter()) #实例方法可以由实例调用,不可以由类调用
print(rec.area())
Rectangle.features() #类方法可以由类调用,也可以由实例调用
print(rec.sumdata(3,6))
print(Rectangle.sumdata(3,6)) #静态方法既可以由类调用,也可以由实例调用
2.2判断一个对象是方法还是函数,可以用type
print(type(rec.perimeter)) #返回值是method
print(type(Rectangle.features)) #返回值是method
print(type(Rectangle.sumdata)) #返回值是function
2.3#inspect模块
某个对象是否是方法inspect.ismethod()
某个对象是否是函数inspect.isfunction()
import inspect
print(inspect.ismethod(rec.perimeter)) #True
print(inspect.ismethod(rec.features)) #True
print(inspect.ismethod(rec.sumdata)) #False
print(inspect.isfunction(rec.perimeter))
print(inspect.isfunction(rec.features))
print(inspect.isfunction(rec.sumdata))
2.4继承
2.4.1完全继承
class Square(Rectangle):
pass
squ=Square(6,6)
print(squ.perimeter())
print(squ.area())
2.4.2部分继承,重写父类的一些方法
class Square(Rectangle):
def __init__(self,side):
self.length=side
self.width=side
squ=Square(6)
print(squ.perimeter())
print(squ.area())
2.4.3全部重写,相当于没有继承
class Square(Rectangle):
def __init__(self,side):
self.side=side
def perimeter(self):
return self.side*4
def area(self):
return self.side**2
squ=Square(6)
print(squ.perimeter())
print(squ.area())
2.4.4继承父类方法的同时,对父类的方法进行扩展
class Square(Rectangle):
def __init__(self,side):
self.length=side
self.width=side
@classmethod
def features(cls):
super().features() #声明继承父类的方法
print('长和宽也相等')
Square.features()
2.5 @property 声明下面的方法是一个属性而不是方法
class Test1:
a=[1,2,3] #类的静态属性,具有唯一性
def __init__(self):
self.b=[4,5,6] #实例的静态属性,不具有唯一性
2.6 @property #声明下面的方法作为一个属性而不是方法
def fun1(self):
return 'Hello'
tt1=Test1()
print(tt1.fun1) #加了@property装饰器之后,作为属性进行调用
3.面向对象高级
3.1定义:
#私有属性和私有方法
#私有属性和私有方法不能被子类继承,也不能被直接调用.
#在属性的前面加上__,就变成了私有属性.在方法的前面加上__,就变成了私有方法.
#__只在前面加,如果前后都有__,不是私有方法或私有属性
class Class_test1:
__str1='ABCDE' #私有属性
str2='QQQ'
def __init__(self):
pass
def __method1(self):
print('这是一个私有方法')
def method2(self):
print(self.__str1) #在对外开放的方法里调用私有属性
S elf.__method1() #在对外开放的方法里调用私有方法
cls1=Class_test1()
print(cls1.__str1) #私有属性不能被直接调用
cls1.__method1() #私有方法不能被直接调用
print(cls1.str2) #非私有属性可以直接调用
cls1.method2()
3.2所有的类都是object的子类,一个类无论是否声明继承object,实际都继承
class Class10:
''' 天子呼来不上船
自称臣是酒中仙
'''
Class10继承了object,所以可以直接使用object里提供的方法
print(Class10.__dict__) #显示类的属性
print(Class10.__doc__) #显示类的注释
print(Class10.__base__) #显示父类的名称
print(Class10.__bases__) #显示所有父类的名称
print(Class10.__name__) #显示类的名称
3.3多继承
class Money1:
def money(self):
print('一个亿')
class Money2:
def money(self):
print('两个亿')
class Man(Money1,Money2): #继承多个父类时,用逗号隔开,多个父类中有同名方法时,按照继承顺序进行继承
pass
man=Man()
man.money()
3.4多态
例1
class Animal:
pass
class Dog(Animal):
def say(self):
print('汪汪汪')
class Cat(Animal):
def say(self):
print('喵喵喵')
def animal_say(obj):
obj.say()
dog=Dog()
cat=Cat()
animal_say(dog)
例2
class Fanguan:
pass
class Yuxiangrousi(Fanguan):
def caidan(self):
print('鱼香肉丝')
class Gongbaojiding(Fanguan):
def caidan(self):
print('宫保鸡丁')
class Qingjiaotudousi(Fanguan):
def caidan(self):
print('青椒土豆丝')
def fuwuyuan(obj):
obj.caidan()
guke1=Yuxiangrousi()
guke2=Gongbaojiding()
guke3=Qingjiaotudousi()
fuwuyuan(guke3)
写一个猜数字游戏,需求如下:随机生成一个100以内的整数,让用户猜,如果猜对了,提示回答正确,游戏结束 如果猜错了,提示过大或过小,可以猜7次
from random import randint
answer=randint(1,100) #在1-100之间生成一个整数,包含边界值
for i in range(7):
input1=input('请输入一个数字: ')
if not input1.isdigit():
print('您输入的不是数字,游戏结束')
break
else:
input1=int(input1) #将用户输入的字符串型数字转为真正的数字
if input1==answer:
print('回答正确,游戏结束')
break
elif input1>answer:
print('数字过大')
else:
print('数字过小')
写一个三角形的类
class Sanjiaoxing:
def __init__(self,a,b,c):
self.a=a
self.b=b
self.c=c
def zhouchang(self):
if self.a+self.b<=self.c or self.a+self.c<=self.b or self.b+self.c<=self.a:
return '无法构成三角形,忽略周长'
else:
return self.a+self.b+self.c
def mianji(self):
if self.a + self.b <= self.c or self.a + self.c <= self.b or self.b + self.c <= self.a:
return '无法构成三角形,忽略面积'
else:
p=(self.a+self.b+self.c)/2
return (p*(p-self.a)*(p-self.b)*(p-self.c))**0.5
sjx=Sanjiaoxing(3,4,5)
print(sjx.zhouchang())
print(sjx.mianji())