首页 > 编程语言 >Python学习笔记--面向对象--进阶

Python学习笔记--面向对象--进阶

时间:2023-02-02 17:24:36浏览次数:35  
标签:__ 进阶 -- self 绑定 Python print def name

1.一切皆对象,什么是一切皆对象?

  • python中,创建一个学生类,也就是创建了一个类型叫学生类。
  • class Student:
        def __init__(self, x, y, z):
            self.name = x
            self.age = y
            self.gender = z
    
        def choose(self):
            pass
    
    
    obj1 = Student("liqi", 18, "male")
    print(type(obj1))   # <class '__main__.Student'>
    print(Student)  # <class '__main__.Student'>
    # 上面这两个是一样的。

     

2.用样的,list也是一个类?

  • 对的。
  • class Student:
        def __init__(self, x, y, z):
            self.name = x
            self.age = y
            self.gender = z
    
        def choose(self):
            pass
    
    
    obj1 = Student("liqi", 18, "male")
    print(type(obj1))   # <class '__main__.Student'>
    print(Student)  # <class '__main__.Student'>
    # 上面这两个是一样的。
    
    print(list) # <class 'list'>
    l1 = list([1,2,3])
    print(l1,type(l1))  # [1, 2, 3] <class 'list'>
    l1.append(4)    # 增加4
    print(l1)
    
    list.append(l1,777) # 同样增加了,用类的方法,把obj传进去
    print(l1)   # [1, 2, 3, 4, 777]
    View Code

     

 3.property是什么?

  • 是一个装饰器,用来把方法变为属性。
  • 比如,BMI这个值,是计算出来的,以函数的形式存在,但我们想把这个变为属性,就用到property
  • 代码示例:
    •   
      class Student:
          def __init__(self, name, weight, height):
              self.name = name
              self.weight = weight
              self.height = height
      
          @property
          def bmi(self):  # 计算BMI,公式为体重/身高的平方
              # BMI = 75kg / (1.75m^2)
              return self.weight / (self.height ** 2)
      
      
      obj1 = Student("LIQI", 65, 1.6)
      print(obj1.bmi)
      # 但是bmi给人感觉是个数据,是个属性,而这里是个方法。
      # 如何把这个方法变为属性呢?用到@property 把方法变为他的属性

       

 4.那被property装饰后的隐藏name属性,在外部如何修改呢?

  • 利用@name.setter
  • 示例代码:
    • class Student:
          def __init__(self, name):
              self.__name = name  # 把name保护起来
      
          @property
          def name(self):
              return self.__name
      
          @name.setter    # 像正常属性一样可以赋值
          def name(self, new_name):
              self.__name = new_name
      
          @name.deleter   # 不可以删除
          def name(self):
              print("不允许删除~!")
      
      
      obj1 = Student("liqi")  # 正常执行
      print(obj1.name)
      
      obj1.name = "tutu"  # 修改
      print(obj1.name)
      
      del obj1.name   # 删除

       

  • 示例代码2(这样也可以)
    •   
      class Student:
          def __init__(self, name):
              self.__name = name  # 把name保护起来
      
          def get_name(self):
              return self.__name
      
          def set_name(self, new_name):
              self.__name = new_name
      
          def del_name(self):
              print("11不允许删除~!")
      
          name = property(get_name, set_name, del_name)
      
      
      obj1 = Student("liqi")  # 正常执行
      print(obj1.name)
      
      obj1.name = "tutu"  # 修改
      print(obj1.name)
      
      del obj1.name  # 删除

       

 5.classmethod是什么?

  • 被classmethod修饰过的函数,是绑定给类的方法。
  • 正常的函数,是默认绑定给对象的方法。
  • 绑定给谁就应该由谁来调用。
  • 示例代码:
    • # 绑定方法
      #   特点:绑定给谁就应该由谁来调用,谁来调用就会将自己当做第一个参数传入
      
      # 非绑定方法
      #   特点:不与类和对象绑定,意味着谁都可以来调用,但无论谁来调用就是一个普通函数,没有自动传参的效果
      class People:
          def __init__(self, name):
              self.name = name
      
          # 但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象来调用
          # 调用时,会将对象作为第一个参数自动传入
          def tell(self):
              print(self.name)
      
          # 类中定义的函数被classmethod装饰过,就绑定给类,应该由类来调用
          # 调用时,会将类本身第一个参数自动传入
          @classmethod
          def func(cls):
              print(cls)
      
      
      People.func()  # <class '__main__.People'>

       

 6.可以不绑定给任何类,也不绑定给对象吗?

  • 可以。用staticmethod来实现。

7.staticmethod是什么?

  • 不绑定类,也不绑定给对象,就是单纯的一个函数。
  • 示例代码:
    • # 绑定方法
      #   特点:绑定给谁就应该由谁来调用,谁来调用就会将自己当做第一个参数传入
      
      # 非绑定方法
      #   特点:不与类和对象绑定,意味着谁都可以来调用,但无论谁来调用就是一个普通函数,没有自动传参的效果
      class People:
          def __init__(self, name):
              self.name = name
      
          # 但凡在类中定义一个函数,默认就是绑定给对象的,应该由对象来调用
          # 调用时,会将对象作为第一个参数自动传入
          def tell(self):
              print(self.name)
      
          # 类中定义的函数被classmethod装饰过,就绑定给类,应该由类来调用
          # 调用时,会将类本身第一个参数自动传入
          @classmethod
          def func(cls):
              print(cls)
      
          # 类中定义的函数被staticmethod装饰过,不绑定给任何,谁都可以来调用
          # 调用时,当做普通函数来使用
          @staticmethod
          def demo(x,y):
              print(x,y)
      
      
      # People.func()  # <class '__main__.People'>
      People.demo(4,5)
      obj = People("tom")
      obj.demo(3,2)

       

8.什么时候用对象的方法,什么时候用类的方法?什么时候用静态方法(普通函数)?

  • 他们的区别,也就是应用的不同。
  • 示例:
    • 场景1,类的参数,从配置文件导的时候。
    • 场景2,对象,类都可以的调用,来生成uuid,不需要传参数。
  • 示例代码:
    • import setting
      
      
      class People:
          def __init__(self, name, age, gender):
              self.name = name
              self.age = age
              self.gender = gender
      
          def tell_info(self):
              print(f'名字:{self.name},年龄:{self.gender},性别:{self.gender}')
      
          @classmethod
          def from_conf(cls):
              print("类的方法==>", cls)
              return cls(setting.NAME, setting.AGE, setting.GENDER)
      
          @staticmethod
          def creat_id():
              import uuid
      
              return uuid.uuid1()
      
      
      p1 = People("tutu", 18, "male")
      
      # p2 = People.from_conf()
      # print(p2.__dict__)  # {'name': 'liqi', 'age': 18, 'gender': 'female'}
      
      print(p1.creat_id())  # 对象可以来调用
      print(People.creat_id())  # 类也可以来调用

       

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考资料

标签:__,进阶,--,self,绑定,Python,print,def,name
From: https://www.cnblogs.com/liqi175/p/17082859.html

相关文章

  • Google XSS Game
    XSSgame(xss-game.appspot.com)这是一款谷歌的XSS游戏,总共有6个级别Level1无需转义,直接编辑URL栏或者搜索框中都可以执行<script>alert(1)</script>Leve......
  • geotools读取shp文件中文乱码???
    在读取shp文件之前,先要手动调用一下ShapefileDataStore的setStringCharset方法即可dataStore.setStringCharset(Charset.forName("UTF-8"));参考:https://www.osgeo.cn/p......
  • 2009-03-确认关系开始交往
     这些天刘文轩一边准备面试简历,一边与女同学丽丽的关系逐渐升温。这天晚上刘文轩与丽丽如同往常一样在QQ上闲聊着,突然丽丽说“我好像有点喜欢你了”。刘文轩看到这段话心......
  • Java基础学习10--算法
     队列(2023-02-02)使用数组模拟队列(未优化)1.需要用的变量有front=-1,rear=-1,maxsize以及数组int[]arr;2.判断队列已满的条件是rear==maxsize-1,队列为空的条件是rear==fro......
  • JQuery案例和插件机制
    案例-广告显示和隐藏需求:1.当页面加载完,3秒后,自动显示广告2.广告显示5秒后,自动消失分析:1.使用定时器完成,setTimeout(执行一次定时器)2.分析......
  • 玩转web3第二篇——Web3UI Kit
    介绍开发web2应用的时候,可以很方便找到很多优秀的UI库,比如antd,materialui,elementui等等,但web3应用对应的UI库却不多。今天给大家介绍一款优秀的WEB3的UI库——Web3UIK......
  • Python之字典遍历元素(4种方式)
    第一种:foringirl_dict={"China":"小美","Japan":"图多天光","Korea":"斯密达美"}foreveryKeyingirl_dict:print("key:"+everyKey+"value:"......
  • serializers.Serializer and ModelSerializer
    昨日回顾#1APIView---->drf提供的,继承了原来的View,以后如果写视图类,都继承APIView及其子类#2APIView执行流程 -1去除了csrf认证-2包装了新的Request对象---......
  • 后端返回时间戳倒计时
    //倒计时   payTime(){    //创建订单的时间    letcreatedAt=(Date.parse(this.data.created_at))/1000;    constIntervalTim......
  • linux网络知识:路由策略(ip rule,ip route)
    一,路由策略(使用iprule命令操作路由策略数据库)基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小,应用或IP源地......