一、property属性

1、什么是property特性?

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值。

  1. from math import pi
  2. class Circle:
  3. def __init__(self,r):
  4. self.r = r
  5. @property
  6. def perimeter(self):
  7. return 2*pi*self.r
  8. @property
  9. def area(self):
  10. return self.r**2*pi
  11.  
  12. c1 = Circle(5)
  13. print(c1.area) # 圆的面积
  14. print(c1.perimeter) # 圆的周长

计算圆的面积和周长

  1. class BMI:
  2. def __init__(self,weight,height):
  3. self.weight=weight
  4. self.height=height
  5. @property
  6. def bmi(self):
  7. return self.weight/self.height**2
  8. gaoya=BMI(47,1.60)
  9. print(gaoya.bmi)

计算胖瘦

2、为什么要用property?

将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则.

在python中通过property方法可以实现提供set和get方法(接口)去设置和获取所有的私有数据。

  1. class Foo:
  2. def __init__(self,val):
  3. self.__NAME=val #将所有的数据属性都隐藏起来
  4.  
  5. @property
  6. def name(self):
  7. return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
  8.  
  9. @name.setter
  10. def name(self,value):
  11. if not isinstance(value,str): #在设定值之前进行类型检查
  12. raise TypeError('%s must be str' %value)
  13. self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
  14.  
  15. @name.deleter
  16. def name(self):
  17. raise TypeError('Can not delete')
  18.  
  19. f=Foo('egon')
  20. print(f.name)
  21. # f.name=10 #抛出异常'TypeError: 10 must be str'
  22. del f.name #抛出异常'TypeError: Can not delete'

一个静态属性property本质就是实现了get,set,delete三种方法。

  1. class Goods:
  2.  
  3. def __init__(self):
  4. # 原价
  5. self.original_price = 100
  6. # 折扣
  7. self.discount = 0.8
  8.  
  9. @property
  10. def price(self): #不能穿参数
  11. # 实际价格 = 原价 * 折扣
  12. new_price = self.original_price * self.discount
  13. return new_price
  14.  
  15. @price.setter
  16. def price(self, value): #能传一个参数
  17. self.original_price = value
  18.  
  19. @price.deleter
  20. def price(self): #不能传参数
  21. del self.original_price
  22.  
  23. obj = Goods()
  24. obj.price # 获取商品价格
  25. obj.price = 200 # 修改商品原价
  26. print(obj.price)
  27. del obj.price # 删除商品原价

注意:set和get 方法使用的前提必须要有property属性;

set可以传一个值,get和property不能传值;

二、classmethod方法

把一个方法,变成一个类中的方法,这个方法就可以直接被类调用,不需要依托任何对象。

当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法.

  1. class Goods:
  2. __discount = 0.8
  3. def __init__(self,name,price):
  4. self.name = name
  5. self.__price = price
  6. @property
  7. def price(self):
  8. return self.__price * Goods.__discount
  9. @classmethod # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象
  10. def change_discount(cls,new_discount): # 修改折扣
  11. cls.__discount = new_discount
  12. apple = Goods('苹果',5)
  13. print(apple.price)
  14. Goods.change_discount(0.5) # Goods.change_discount(Goods)
  15. print(apple.price)

三、staticmethod方法

在完全面向对象的程序中,如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法.

  1. class Login:
  2. def __init__(self,name,password):
  3. self.name = name
  4. self.pwd = password
  5. def login(self):pass
  6.  
  7. @staticmethod
  8. def get_usr_pwd(): # 静态方法
  9. usr = input('用户名 :')
  10. pwd = input('密码 :')
  11. Login(usr,pwd)
  12.  
  13. Login.get_usr_pwd()

补充:

1、类方法和静态方法,都是类调用的。

2、对象可以调用类方法和静态方法吗?

可以,一般情况下,推荐用类名调用。

3、类方法,有一个默认参数,cls代表这个类。

4、静态方法,没有默认的参数,就像函数一样。

面向对象property属性、静态方法和类方法的更多相关文章

  1. Python 进阶_OOP 面向对象编程_静态方法和类方法

    目录 目录 静态方法 类方法 使用函数修饰符来声明静态方法和类方法 静态方法 静态方法仅是类中的函数, 不需要绑定实例, 也就是说静态方法的定义不需要传入 self 参数. 静态方法不属于类的某一个实 ...

  2. Python面向对象静态方法,类方法,属性方法

    Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...

  3. Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass

    Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...

  4. python面向对象之静态属性/静态方法/类方法/组合

    继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...

  5. 面向对象【day08】:静态方法、类方法、属性方法(九)

    本节内容 概述 静态方法 类方法 属性方法 总结 一.概述 前面我们已经讲解了关于类的很多东西,今天讲讲类的另外的特性:静态方法(staticmethod).类方法(classmethod).属性方法 ...

  6. Python面向对象之类属性类方法静态方法

    类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...

  7. 特性(property)/静态方法(staticmethod)/类方法(classmethod)/__str__的用法

    property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 1 import math 2 class Circle: 3 def __init__(self,radius): #圆的 ...

  8. Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法

    静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...

  9. Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射

    1.封装 类中的私有化:属性的私有化和方法的私有化 会用到私有的这个概念de场景 1.隐藏起一个属性 不想让类的外部调用 2.我想保护这个属性,不想让属性随意被改变 3.我想保护这个属性,不被子类继承 ...

随机推荐

  1. fn project 试用之后的几个问题

    今天试用fnproject  之后自己有些思考,后面继续解决   1. 目前测试是强依赖 dockerhub 的,实际可能不是很方便 2. 如何与k8s .mesos.docker swarm  集成 ...

  2. oracle系统表的查询

    oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments   -- 查 ...

  3. Ambari的API调用

    GET api/v1/clusters/HDP/configurations可以获得所有的配置信息(例如,http://hdp0:8080/api/v1/clusters/HDP/configurat ...

  4. svn服务器端回退版本 (转)

    由于误操作,不小心将错误的代码提交到了svn上,于是想在服务器上撤销本次提交,经过尝试,发现进行以下步骤的操作即可彻底删除本次提交: 1.首先找到本次提交后生成的版本号,例如为r224. 2.登录到s ...

  5. emqtt 3 (我要subscribe 这个topic)

    这一次,主要分析client subscribe 某个topic 的处理流程. 由protocol开始 是的,还是要从protocol开始,至于为什么,之前就说过了. subscribe 类型的pac ...

  6. (转)c#实现开机自启动

    RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersio ...

  7. java代码求分数等级的输出~~~

    总结:无论是switch-case-break语句 都不要忘了跳出当前循环,即break; 还有这个输入的分数我如何控制在100以内???? package com.c2; //实现分数等级的输出. ...

  8. 分布式锁之三:Redlock实现分布式锁

    之前写过一篇文章<如何在springcloud分布式系统中实现分布式锁?>,由于自己仅仅是阅读了相关的书籍,和查阅了相关的资料,就认为那样的是可行的.那篇文章实现的大概思路是用setNx命 ...

  9. dB2 索引相关

    ALTER TABLE "XXXX"."tableA" PCTFREE 20 ; CREATE INDEX "schema"."X ...

  10. mybatis如何防止sql注入(2)

    Mybatis框架下SQL注入漏洞修复建议1. 模糊查询like SQL注入修复建议按照新闻标题对新闻进行模糊查询,可将SQL查询语句设计如下:select * from news where ti ...