美文网首页
python-面向对象

python-面向对象

作者: Jalynn葸 | 来源:发表于2018-04-18 11:36 被阅读10次

    面向对象

    面向过程:根据业务逻辑从上到 下写代码
    面向对象(OO):将数据与函数绑定到一起,进行封装,这样能够更快速的开发过程,减少重复代码

    类和对象

    类的构成:
    1、类的名称
    2、类的属性
    3、类的方法
    类里的方法,self做为形参可以不传,也可以自己传参,也可以用其他变量代替self,但是为了程序的可读性,一般用 self

    #encoding:utf-8
    class Cat:
        #属性
        #方法
    #python解析器会自动的调用init方法,一般用于设置默认值
        def __init__(self):
            print("我是猫")
        def eat(self):
            print("猫在吃鱼....")
        def drink(self):
            print("猫在喝水....")
        def introduce(self):
                print("%s的年龄是:%d"%(self.name,self.age))
    
    #创建一个对象
    tom = Cat()
    #调用tom指向对象的方法
    tom.drink()
    tom.eat()
    #给tom添加属性
    tom.name = "汤姆"
    tom.age = 55
    tom.introduce()
    
    lanmao = Cat()
    lanmao.name = "蓝猫"
    lanmao.age = 33
    lanmao.introduce()
    

    通过魔法方法传参数,初始化对象

    #encoding:utf-8
    class Cat:
        #属性
        #方法
        def __init__(self,new_name,new_age):
            self.name = new_name
            self.age = new_name
        def introduce(self):
                print("%s的年龄是:%s"%(self.name,self.age))
    #创建一个对象
    tom = Cat("Tom",40)
    tom.introduce()
    lanmao = Cat("蓝猫",10)
    lanmao.introduce()
    

    获取对象的描述信息时,用str方法,就可以直接打印对象。如下:

    #encoding:utf-8
    class Cat:
        #属性
        #方法
        def __init__(self,new_name,new_age):
            self.name = new_name
            self.age = new_name
        def __str__(self):
            return "%s的年龄是:%s"%(self.name,self.age)
    #创建一个对象
    tom = Cat("Tom",40)
    lanmao = Cat("蓝猫",10)
    
    print(tom)
    print(lanmao)
    
    面向对象的应用

    烤地瓜例子:

    #encoding:utf-8
    class SweetPotato:
        def __init__(self):
            self.cookedstring = "生的"
            self.cookedLevel = 0
            self.condiments = []
        def __str__(self):
            return "地瓜 状态:%s(%d) 佐料:%s"%(self.cookedstring, self.cookedLevel, str(self.condiments))
        def cook(self,cooked_time):
            self.cookedLevel +=cooked_time
            if cooked_time>=0 and cooked_time<3:
                self.cookedstring = "生的"
            elif cooked_time >=3 and cooked_time <5:
                self.cookedstring = "半生不熟"
            elif cooked_time>=5 and cooked_time<8:
                self.cookedstring = "熟了"
            elif cooked_time>8:
                self.cookedstring = "糊了"
        def addCondiments(self, item):
            self.condiments.append(item)
    digua = SweetPotato()
    digua.cook(2)
    digua.addCondiments("孜然")
    print(digua)
    digua.cook(4)
    digua.addCondiments("大蒜")
    print(digua)
    运行结果:
    地瓜 状态:生的(2) 佐料:['孜然']
    地瓜 状态:半生不熟(6) 佐料:['孜然', '大蒜']
    
    面向对象应用2

    存放家具例子:

    #encoding:utf-8
    class Home:
        def __init__(self,new_area,new_info,new_addr):
            self.area = new_area
            self.info = new_info
            self.addr = new_addr
            self.leftarea = new_area
            self.contain_items = []
        def __str__(self):
            msg = "房子的总面积是:%d,可用面积是:%d,户型是:%s,地址是:%s"%(self.area, self.leftarea, self.info, self.addr)
            msg+= "当前房子的家具有:%s"%(str(self.contain_items))
            return msg
        def add_item(self,item):
            self.leftarea -= item.area
            self.contain_items.append(item.name)
    class Bed:
        def __init__(self,new_name,new_area):
            self.name = new_name
            self.area = new_area
        def __str__(self):
            return "%s占地的面积是:%d"%(self.name,self.area)
    fangzi = Home(129,"三室两厅","北京朝阳")
    print(fangzi)
    bed1  = Bed("席梦思",4)
    #print(bed1)
    fangzi.add_item(bed1)
    print(fangzi)
    bed2 = Bed("儿童床",3)
    fangzi.add_item(bed2)
    print(fangzi)
    运行结果:
    房子的总面积是:129,可用面积是:129,户型是:三室两厅,地址是:北京朝阳当前房子的家具有:[]
    房子的总面积是:129,可用面积是:125,户型是:三室两厅,地址是:北京朝阳当前房子的家具有:['席梦思']
    房子的总面积是:129,可用面积是:122,户型是:三室两厅,地址是:北京朝阳当前房子的家具有:['席梦思', '儿童床']
    
    私有属性和私有方法

    set和get方法

    #encoding:utf-8
    class Dog:
        def set_age(self,new_age):
            if new_age >0 and new_age<100:
                self.age = new_age
            else:
                self.age = 0  
        def get_age(self):
            return self.age
    dog = Dog()
    dog.set_age(10)
    age = dog.get_age()
    #dog.age = 3
    #dog.name = "小白"
    print(dog.age)
    

    私有方法加一个__,不能用对象直接调用

    #encoding:utf-8
    class Dog:
        #私有方法
        def __test1(self):
            print("--正在发送短信--")
        #公有方法
        def test2(self,new_monney):
            if new_monney >10000:
                self.__test1()
            else:
                print("余额不足,请充值")
    dog = Dog()
    #dog.__test1()
    dog.test2(1000000)
    
    del()方法
    #encoding:utf-8
    class Dog:
        def __del__(self):
            print("正在销毁")
    dog1 = Dog()
    dog2 = dog1
    del dog2
    del dog1
    print("---------------------------")
    运行结果:
    正在销毁
    ---------------------------
    
    #encoding:utf-8
    class Dog:
        def __del__(self):
            print("正在销毁")
    dog1 = Dog()
    dog2 = dog1
    del dog1
    print("---------------------------")
    运行结果:
    ---------------------------
    正在销毁
    

    从以上两个代码片可以看出,当一个对象的所有引用都被删除后才会自动调用del方法,并且,此方法系统自动调用,无需手动调用。即引用计数器为0时才会自动销毁

    获取引用计数器的方法
    >>> import sys
    >>> class T:
    ...     pass
    ... 
    >>> t = T()
    >>> sys.getrefcount(t)
    2
    >>> tt = t
    >>> sys.getrefcount(t)
    3
    

    相关文章

      网友评论

          本文标题:python-面向对象

          本文链接:https://www.haomeiwen.com/subject/hgxvkftx.html