九.面向对象:基础+进阶+高阶

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())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值