一点Python总结(2)

面向过程 怎么做?
面向对象 谁来做?

先有类再有对象

类只有一个,对象可以有多个

定义类class
对对象的特征描述,通常可以定义成属性
对象具有的行为通常可以定义为方法

在Python中对象几乎是无处不在的

dir()函数可以查看所有属性和方法

增加属性 类名.属性名
可以通过self.访问对象的属性
也可以通过self.调用其他的对象方法
(你推荐在外部增加属性)

__init__初始化方法,专门定义一个类具有哪些属性的方法

excaption 异常

捕获异常
try:可能出现异常的代码块
except OSError as reason:异常信息
finally:是否出现异常都执行

oop特征
封装 继承 多态

self
在类中定义的方法自动会跟着一个self,是该方法默认的一个参数,后面的参数都要保存在self中

公有和私有
私有机制是伪私有,在变量前加__
实则可以用 对象._类名__变量名访问私有变量

继承
class Parent :
class Child(Parent):
子类括号内写父类名,即继承该父类

子类对象不能在自己的方法内部直接访问父类的私有属性和方法
子类对象可以通过父类的公有方法间接访问到私有属性和方法

继承list,其他雷同
class lists(list):

Python多继承
可以一次继承多个父类,同时具有多个父类的方法

如果多个父类中有同名方法,应该避免使用多继承

内置属性__mro__可以查看调用方法顺序

新式类:以object为基类的类(推荐)
旧式类:不以object为基类的类(不推荐)
在多继承时,会影响到方法的搜索顺序
建议:如果没有父类,统一继承object

判断类a是否是类b的子类
issubclass(a,b)

a是否为b的实例对象
isinstance(a,b)

a对象是否有b属性
hasattr(a,b)

返回对象的指定属性值,default提示信息
getattr(a,b,default)

设置a对象中b属性的value值
setattr(a,b,value)

删除对象a中的b属性
delattr(a,b)

魔法方法
被双下划线包围
new(cls[,…])

str(self):
return
方法必须返回一个字符串

封装案例

class Person():
    def __init__(self,name,weight):
        self.name=name
        self.weight=weight
    def __str__(self):
        return "我叫%s,我的体重是%.2f" %(self.name,self.weight)
    def run(self):
        print("%s爱跑步,跑步锻炼身体" % self.name)
        self.weight-=0.5
    def eat(self):
        print("%s爱吃饭,吃饭长身体" % self.name)
        self.weight+=1
xiaoming=Person("晓明",75.5)

xiaoming.run()
xiaoming.eat()
print(xiaoming)
xiaomei=Person("小美",48.5)
xiaomei.run()
xiaomei.eat()
print(xiaomei)

案例2

class HouseItem():
    def __init__(self,name,area):
        self.name=name
        self.area=area
    def __str__(self):
        return "这是%s,占地%.f" %(self.name,self.area)

class House():
    def __init__(self,house_type,area):
        self.house_type=house_type
        self.area=area
        self.free_area=area
        self.item_list=[]
    def __str__(self):
        return ("户型:%s\n总面积,%.2f[剩余:%.2f]\n家具:%s"
                %(self.house_type,self.area,self.free_area,self.item_list))
    def add_item(self,item):
        print("添加%s" %item)
        #判断家具的面积
        if item.area>self.free_area:
            print("%s家具太大,无法添加" % item.name)
            return
        #添加家具
        self.item_list.append(item.name)
        #计算剩余
        self.free_area-=item.area
#创建家具
#床
bed=HouseItem("席梦思",4)
print(bed)
#衣柜
chest=HouseItem("衣柜",2)
print(chest)
#餐桌
table=HouseItem("餐桌",1.5)
print(table)
#创建房子
my_house=House("两室一厅",90)
my_house.add_item(bed)
my_house.add_item(chest)
my_house.add_item(table)
print(my_house)

身份运算符
is 是判断两个标识符是不是引用的同一个对象
is not 是判断两个标识符是不是引用不同对象
is与==区别
==用于判定两个值是否相等

多态:不同的子类对象调用相同的父类方法,产生不同的执行结果

案例1:

class Dog(object):
    def __init__(self,name):
        self.name=name
    def game(self):
        print("%s玩游戏" %self.name)
class XiaoTianDog(Dog):
    def game(self):
        print("%s飞到天上去玩" %self.name)

class Person(object):
    def __init__(self,name):
        self.name=name
    def gamewithdog(self,dog):
        print("%s和%s愉快的玩耍" %(dog.name,self.name))
        dog.game()

xiaotian=XiaoTianDog("啸天")
dog=Dog("狗")
person=Person("小明")
person.gamewithdog(xiaotian)
person.gamewithdog(dog)

创建对象:1在内存中为对象分配空间
调用初始化方法为对象初始化
实例:创建出来的对象叫类的实例

猜你喜欢

转载自blog.csdn.net/weixin_42481081/article/details/83059781