- 面向过程:根据业务逻辑从上而下写代码
- 面向过程:对数据与函数绑定到一起,进行封装,这样可以快递进行开发
1.定义类
class 类名:
2.定义方法
class Dog :
#可以直接添加属性,会在调用类的时候直接调用该方法
def __init__(self):
self.weight = 5
self.color = "黄色"
#另
def __init__(self, newWeight, newColor):
self.weight = newWeight
self.color = newColor
def bark(self):
print("汪汪汪")
#方法可以对属性进行修改
def eat(self):
print("吃东西")
self.weight += 5
#创建一只小狗
xiaogou = Dog()
#调用小狗这个对象的一个方法
xiaogou.bark()
xiaogou.run()
#添加属性
xiaogou.weight = 5
xiaogou.color = "黄颜色"
xiaogou.eat()
print(xiaogou.weight)
#验证能否直接修改属性,让小狗的体重增加
xiaogou.weight += 5
wangcai = Dog()
print(wanngcai.weight)
print(wanngcai.weight)
wangcai = Dog(10,"黑色")
理解self:
- 表示自己
- 类中定义的叫方法,不在类中定义的叫函数,方法多的时候,按照self传给你的方法进行调用。
- self是python自动传进去
- self可以理解为就是你创建的对象,类似C++中的this
- 只要是类中的方法,都需要写上self
__str__方法:
- 替换了原来的默认的打印的是内存(魔法方法,一般有下换线的这种__***__)
- 一般用于print方法的时候
def __str__(self):
return "哈哈哈,我是小狗!"
尽量通过方法修改属性,最好不要直接修改属性
存放家具例子:
item,self分别指的是谁,要能够分清楚
#定义一个home家,类
class Home:
def __init__(self, area):
self.area = area
self.rongNaList = []
def __str__(self):
mag = "家当前可用的面积为:" + str(self.area)
return mag
def containItem(self, item):
#API接口,提供一个函数给你用,应用编程接口
bedArea = item.getBedArea()
#此方法也可以用,但是有危险
#bedArea = item.area
if self.area > bedArea:
self.rongNaList.append(item)
self.area -= bedArea
print("当前添加"+ item.getBedName() + "成功。。。当前可用面积" + str(self.area))
else:
print("error:当前物品需要的面积大于家可用的面积:" + item.getBedName())
#定义一个 bed床 类
class Bed:
def __init__(self, name, area):
self.area = area
self.name = name
def __str__(self):
msg = self.name + "床占用的面积为:" + str(self.area)
return msg
def getBedArea(self):
return self.area
def getBedName(self):
return self.name
home = Home(100)
print(home)
bed = Bed('席梦思', 4)
print(bed)
home.containItem(bed)
#bed.getBedArea()
print(home)
bed2 = Bed("木板床", 10)
home.containItem(bed2)
print(home)
bed3 = Bed("超级大的床",170)
home.containItem(bed3)
print(home)
运行结果:
D:\1a\python3.6.1\python.exe E:/python_workspace/python_notes/example9-storeFurniture.py
家当前可用的面积为:100
席梦思床占用的面积为:4
当前添加席梦思成功。。。当前可用面积96
家当前可用的面积为:96
当前添加木板床成功。。。当前可用面积86
家当前可用的面积为:86
error:当前物品需要的面积大于家可用的面积:超级大的床
家当前可用的面积为:86
放置家具升级:
#定义一个home家,类
class Home:
def __init__(self, area):
self.area = area
self.rongNaList = []
#灯的状态为off
self.light = 'off'
def __str__(self):
msg = "家当前可用的面积为:" + str(self.area) + ": 灯的状态为: " + self.light
if len(self.rongNaList) > 0:
msg += "; 当前有 : "
#因为在append的时候,添加的是对象的引用,那么此时的temp就是对象的应用,可以理解为就是一个对象
for temp in self.rongNaList:
msg += temp.getBedName() + ", "
msg = msg.strip(", ")
return msg
def containItem(self, item):
#API接口,提供一个函数给你用,应用编程接口
bedArea = item.getBedArea()
#此方法也可以用,但是有危险
#bedArea = item.area
if self.area > bedArea:
self.rongNaList.append(item)
self.area -= bedArea
print("当前添加"+ item.getBedName() + "成功。。。当前可用面积" + str(self.area))
else:
print("error:当前物品需要的面积大于家可用的面积:" + item.getBedName())
def turnOn(self):
self.light = "on"
#把家里的所有家具都变成“亮”的状态
for temp in self.rongNaList:
#调用这个方法,用来修改相关物品的“亮”的状态
temp.setlight()
return self.light
#定义一个 bed床 类
class Bed:
def __init__(self, name, area):
self.area = area
self.name = name
self.light = "off"
def __str__(self):
msg = self.name + "床占用的面积为:" + str(self.area)
return msg
def getBedArea(self):
return self.area
def getBedName(self):
return self.name
def setlight(self):
self.light = "on"
def setlightOff(self):
self.light = "off"
home = Home(100)
print(home)
bed = Bed('席梦思', 4)
print(bed)
home.containItem(bed)
#bed.getBedArea()
print(home)
bed2 = Bed("木板床", 10)
home.containItem(bed2)
print(home)
bed3 = Bed("超级大的床",170)
home.containItem(bed3)
print(home)
home.turnOn()
print(home)
print(bed)
print(bed2)
print(bed3)
运行结果:
D:\1a\python3.6.1\python.exe E:/python_workspace/python_notes/example10-storeFurniture2.py
家当前可用的面积为:100: 灯的状态为: off
席梦思床占用的面积为:4
当前添加席梦思成功。。。当前可用面积96
家当前可用的面积为:96: 灯的状态为: off; 当前有 : 席梦思
当前添加木板床成功。。。当前可用面积86
家当前可用的面积为:86: 灯的状态为: off; 当前有 : 席梦思, 木板床
error:当前物品需要的面积大于家可用的面积:超级大的床
家当前可用的面积为:86: 灯的状态为: off; 当前有 : 席梦思, 木板床
家当前可用的面积为:86: 灯的状态为: on; 当前有 : 席梦思, 木板床
席梦思床占用的面积为:4
木板床床占用的面积为:10
超级大的床床占用的面积为:170
保护属性:
采用下划线____ eg: self.__name, 这样的属性叫做私有属性
然后重新定义新方法
eg: def setNewage(self)
def getAge(self)
—del—()方法:
结束之前要做的事情
只要对象不用了,python解释器会自动调用该方法,python需要回收相关空间
del不会彻底删除,只有当引用计数为0的时候,才会彻底删除
继承:
来自于一个叫做单继承
来自于一个或者多个,则叫做多继承
父类也叫做基类
子类也叫做派生类
私有属性不会被继承。如果非要使用,就把下划线去掉
如果是用过继承来的方法访问私有属性,是可以的,如果是子类中,自定义了一个方法,此方法不可以访问
只要是私有,通过对象就不可以用,除非采用方法
class Animal(object):#object可写可不写
###
class Dog(Animal):
###
重写:
class Animal(object):
def bark(self):
###
class Cat(Anlmal):
def bark(self):
Animal.bark(self)
super().bark()
###
多继承–一个类可以有无穷多个父类:
先遍历直接继承的,然后找其兄弟, 类似与广度遍历
print(c.__ mro __): 可以查看C类的对象搜索方法时的先后顺序。只有python3中有
class Base (object):
def test(self):
print("------------A test ------------------")
class A (Base):
def test(self):
print("------------A test ------------------")
def testA(self):
print("------------A test ------------------")
class B (Base):
def testB(self):
print("------------B test ------------------")
class C(A, B):
pass
c = C()
c.testA()
c.testB()
c.test()
多态:
调用的方法是同一个,但是执行的代码不一样
class Animal(object):
def bark(self):
print("啊啊~")
class Cat(Animal):
def bark(self):
print("喵喵~")
class Dog(Animal):
def bark(self):
print("汪汪~")
class roboot(object):
def bark(self):
print("嗡嗡嗡")
def animalBark(temp):
temp.bark()
maomi = Cat()
wangcai = Dog()
animalBark(maomi)
animalBark(wangcai)
dingdang = roboot()
animalBark(dingdang)
================运行结果=========================
D:\1a\python3.6.1\python.exe E:/python_workspace/python_notes/example11-JiChen.py
喵喵~
汪汪~
嗡嗡嗡