• 类和对象


    1、类和对象

    类有类名、属性和方法

    1.1 类的定义和对象创建

    ## 定义类,类的三要素,类名,类属性,类方法
    class Cat:			## 此处不执行,只定义,类名为Cat
    
        ## 属性 即变量,在外面定义,也可以使用__init__方法接收实参
        ## 初始化对象,__init__(self)方法,默认自动调用
        def __init__(self,name,age):
            self.name = name
            self.age = age
    
        ## 可以直接调用对象,必须有return,如使用print(tom)调用
        def __str__(self):
            return "str测试 %s 的年龄是%d"%(self.name,self.age)
        
        
        ## 方法
        def eat(self):
            print("猫在吃鱼 ....")
            
        def drink(self):
            print("猫在喝水 ....")
    
        ## self的功能,用作接收对象
        def introduce(self):
            # print('%s 的年龄是%d'%(tom.name,tom.age))
            print('%s 的年龄是%d'%(self.name,self.age))
            
    ## 创建对象
    # tom = Cat()        ## 执行Cat(),返回对象的引用,使用tom指向该引用
    tom = Cat("汤姆",40)
    print(tom)
    
    ## 调用tom指向对象中的方法 
    tom.eat()          
    tom.drink()
    
    ## 给tom指向的对象添加两个属性
    # tom.name = '汤姆'
    # tom.age = 40
    
    # 调用属性,self的使用
    # print('%s 的年龄是%d'%(tom.name,tom.age))
    tom.introduce() ## 相当于 tom.introduce(tom)
    
    ## 总结
    lanmao =Cat("蓝猫",10)	## class Cat  +  def __init__
    print(lanmao)		## def __str__
    lanmao.eat()		## def eat
    lanmao.drink()		## def drink
    lanmao.introduce()	## def introduce
    

    2、类的案例

    2.1 给房子加入家具,对应减少可用面积

    ## 类的案例:给房子加入家具,对应减少可用面积
    
    class Home:
        def __init__(self,new_area,new_info,new_address):
            self.area = new_area
            self.info = new_info
            self.address = new_address
            self.left_area = new_area
            self.container_item = []
        
        def __str__(self):
            msg =  "房子面积:%d平米,可用面积:%d,户型信息:%s ,房子地址:%s"%(self.area,self.left_area,self.info,self.address)
            msg += "包含家具:%s"%(str(self.container_item))
            return msg
    
        def add_jiaju(self,item):
            # self.left_area -= item.area
            # self.container_item.append(item.name)  ## 注意:能直接获取变量值的,都应该改为函数调用,应为item可能不会返回给你值
            self.left_area -= item.get_area()
            self.container_item.append(item.get_name())
    
    
    class JIAJU:
        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)
    
        def get_area(self):
            return self.area
        
        def get_name(self):
            return self.name    ## 我自己可以决定是否返回,控制权限
    
    ## 实例化房子fangzi
    fangzi = Home(120,"三室一厅","上海市浦东新区金桥镇")
    
    ## 实例化席梦思ximengsi
    ximengsi = JIAJU("席梦思",4)
    
    ## 房子加入家具-席梦思
    fangzi.add_jiaju(ximengsi)
    print(fangzi)
    
    ## 房子加入家具-冰箱
    bingxiang = JIAJU("冰箱",1)
    fangzi.add_jiaju(bingxiang)
    print(fangzi)
    

    3、隐藏属性(私有属性)

    3.1 用函数对变量的控制

    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(-1)
    age = dog.get_age()
    print(age)
    

    4、私有方法

    class Msg:
        ## 私有方法
        def __send_msg(self):		## __开头的自定义方法,叫私有方法,类以外的函数不能调用
            print("--------短信发送中------")
    	## 公有方法
        def send_msg(self,new_money):	
            if new_money >= 10000:
                self.__send_msg()	## 满足条件时,内部调用私有方法
            else:
                print("余额不足,请充值")
    
    msg = Msg()
    msg.send_msg(13330)
    

    5、类的继承和重写

    class Animal:        ## 定义类
        def __init__(self):
            self.name='zhangsan'
            self.__age=40
        
        def __info(self):       ## 私有方法
            print(self.name)
            print(self.__age)
    
        def info(self):       ## 公有方法
            print(self.name)
            print(self.__age)
        
        def eat(self):
            print("------吃------")
        def drink(self):
            print("------喝------")
        def sleep(self):
            print("------睡------")
        def run(self):
            print("------跑------")
    
    class Dog(Animal):  ## 定义子类,继承Animal
        def wangwang(self):
            print("-----汪汪汪------")
    
    class Xiaotq(Dog):  ## 继承Dog类
        def fly(self):
            print("-------飞-----")
        
        def wangwang(self):             ## 重写方法,不使用父类的方法
            print("-----狂吠------")
            ## 调用父类方法1
            # Dog.wangwang(self)          ## 调用父类的方法,必须带有self
            ## 调用父类方法2
            super().wangwang()            ## 注意super()
    
    xiaotq = Xiaotq()
    xiaotq.fly()
    xiaotq.wangwang()
    xiaotq.eat()
    # xiaotq.__info()   ## 不能继承私有方法
    xiaotq.info()       ## 能通过该类的公有方法去调用私有属性和方法
    print(xiaotq.name)  ## 能继承公有属性
    # print(xiaotq.__age) ## 不能继承私有属性
    

    6、类属性,类方法,实例方法,静态方法及调用

    • 一个程序中尽量使用类或函数中的其中一种
    • 推荐使用类,要用到函数时,用静态方法代替函数
    • 函数放到类中叫实例方法,@staticmethod标识的叫做静态方法
    class Tools(object):
        ## 类属性
        num = 0
    
        ## 实例方法,必须要参数self
        def __init__(self,new_name):
            ## 实例属性
            self.name = new_name
            ## 实例中使用类属性,需要加上类名
            Tools.num += 1
        
        ## 类方法,必须要参数,cls
        @classmethod
        def add_num(cls):
            cls.num = 100
    
        ## 静态方法,可以没有参数,等同于函数
        @staticmethod
        def print_menu():
            print("------------")
            print("-- 穿越火线1.1 --")
            print("- 开始游戏 -")
            print("- 结束游戏 -")
            print("------------")
    
    tool1 = Tools("铁锹")
    tool2 = Tools("锄头")
    tool3 = Tools("火钳")
    print(tool1.num)        ## 实例调用实例属性
    
    ## 调用类属性
    Tools.add_num()         ## 直接使用类名调用类属性
    print(Tools.num)
    
    tool = Tools("")        ## 创建对象
    tool.add_num()          ## 类对象调用类方法
    print(Tools.num)
    
    ## 调用静态方法
    Tools.print_menu()      ## 通过类名直接调用
    tool.print_menu()       ## 通过对象调用静态方法
    
  • 相关阅读:
    [Linux] Nginx服务下统计网站的QPS
    [Go] go等待读取最后一行的数据内容
    [Go] Golang中的面向对象
    [Linux] 常见的并发模型
    [PHP] pmap可以查看进程占用内存的详细情况
    [PHP] 解决php中上传大文件的错误
    [PHP] 循环查看php-fpm的内存占用情况
    [Go] go中的goto语句跳到指定标签
    Java抽象类(Abstract Class)与接口(Interface)区别
    Java访问级别修饰符
  • 原文地址:https://www.cnblogs.com/moox/p/13285080.html
Copyright © 2020-2023  润新知