面向对象property属性、静态方法和类方法
一、property属性
1、什么是property特性?
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值。
- from math import pi
- class Circle:
- def __init__(self,r):
- self.r = r
- @property
- def perimeter(self):
- return 2*pi*self.r
- @property
- def area(self):
- return self.r**2*pi
- c1 = Circle(5)
- print(c1.area) # 圆的面积
- print(c1.perimeter) # 圆的周长
计算圆的面积和周长
- class BMI:
- def __init__(self,weight,height):
- self.weight=weight
- self.height=height
- @property
- def bmi(self):
- return self.weight/self.height**2
- gaoya=BMI(47,1.60)
- print(gaoya.bmi)
计算胖瘦
2、为什么要用property?
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则.
在python中通过property方法可以实现提供set和get方法(接口)去设置和获取所有的私有数据。
- class Foo:
- def __init__(self,val):
- self.__NAME=val #将所有的数据属性都隐藏起来
- @property
- def name(self):
- return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
- @name.setter
- def name(self,value):
- if not isinstance(value,str): #在设定值之前进行类型检查
- raise TypeError('%s must be str' %value)
- self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
- @name.deleter
- def name(self):
- raise TypeError('Can not delete')
- f=Foo('egon')
- print(f.name)
- # f.name=10 #抛出异常'TypeError: 10 must be str'
- del f.name #抛出异常'TypeError: Can not delete'
一个静态属性property本质就是实现了get,set,delete三种方法。
- class Goods:
- def __init__(self):
- # 原价
- self.original_price = 100
- # 折扣
- self.discount = 0.8
- @property
- def price(self): #不能穿参数
- # 实际价格 = 原价 * 折扣
- new_price = self.original_price * self.discount
- return new_price
- @price.setter
- def price(self, value): #能传一个参数
- self.original_price = value
- @price.deleter
- def price(self): #不能传参数
- del self.original_price
- obj = Goods()
- obj.price # 获取商品价格
- obj.price = 200 # 修改商品原价
- print(obj.price)
- del obj.price # 删除商品原价
注意:set和get 方法使用的前提必须要有property属性;
set可以传一个值,get和property不能传值;
二、classmethod方法
把一个方法,变成一个类中的方法,这个方法就可以直接被类调用,不需要依托任何对象。
当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法.
- class Goods:
- __discount = 0.8
- def __init__(self,name,price):
- self.name = name
- self.__price = price
- @property
- def price(self):
- return self.__price * Goods.__discount
- @classmethod # 把一个方法 变成一个类中的方法,这个方法就直接可以被类调用,不需要依托任何对象
- def change_discount(cls,new_discount): # 修改折扣
- cls.__discount = new_discount
- apple = Goods('苹果',5)
- print(apple.price)
- Goods.change_discount(0.5) # Goods.change_discount(Goods)
- print(apple.price)
三、staticmethod方法
在完全面向对象的程序中,如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法.
- class Login:
- def __init__(self,name,password):
- self.name = name
- self.pwd = password
- def login(self):pass
- @staticmethod
- def get_usr_pwd(): # 静态方法
- usr = input('用户名 :')
- pwd = input('密码 :')
- Login(usr,pwd)
- Login.get_usr_pwd()
补充:
1、类方法和静态方法,都是类调用的。
2、对象可以调用类方法和静态方法吗?
可以,一般情况下,推荐用类名调用。
3、类方法,有一个默认参数,cls代表这个类。
4、静态方法,没有默认的参数,就像函数一样。
面向对象property属性、静态方法和类方法的更多相关文章
- Python 进阶_OOP 面向对象编程_静态方法和类方法
目录 目录 静态方法 类方法 使用函数修饰符来声明静态方法和类方法 静态方法 静态方法仅是类中的函数, 不需要绑定实例, 也就是说静态方法的定义不需要传入 self 参数. 静态方法不属于类的某一个实 ...
- Python面向对象静态方法,类方法,属性方法
Python面向对象静态方法,类方法,属性方法 属性: 公有属性 (属于类,每个类一份) 普通属性 (属于对象,每个对象一份) 私有属性 (属于对象,跟普通属性相似,只是不能通过对象直接访问) 方法: ...
- Python面向对象05 /私有成员、类方法、静态方法、属性、isinstance/issubclass
Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/issubclass 目录 Python面向对象05 /私有成员.类方法.静态方法.属性.isinstance/is ...
- python面向对象之静态属性/静态方法/类方法/组合
继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...
- 面向对象【day08】:静态方法、类方法、属性方法(九)
本节内容 概述 静态方法 类方法 属性方法 总结 一.概述 前面我们已经讲解了关于类的很多东西,今天讲讲类的另外的特性:静态方法(staticmethod).类方法(classmethod).属性方法 ...
- Python面向对象之类属性类方法静态方法
类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...
- 特性(property)/静态方法(staticmethod)/类方法(classmethod)/__str__的用法
property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 1 import math 2 class Circle: 3 def __init__(self,radius): #圆的 ...
- Python的程序结构[1] -> 方法/Method[1] -> 静态方法、类方法和属性方法
静态方法.类方法和属性方法 在 Python 中有三种常用的方法装饰器,可以使普通的类实例方法变成带有特殊功能的方法,分别是静态方法.类方法和属性方法. 静态方法 / Static Method 在 ...
- Python进阶-XVIII 封装、(属性、静态方法、类方法)语法糖、反射
1.封装 类中的私有化:属性的私有化和方法的私有化 会用到私有的这个概念de场景 1.隐藏起一个属性 不想让类的外部调用 2.我想保护这个属性,不想让属性随意被改变 3.我想保护这个属性,不被子类继承 ...
随机推荐
- fn project 试用之后的几个问题
今天试用fnproject 之后自己有些思考,后面继续解决 1. 目前测试是强依赖 dockerhub 的,实际可能不是很方便 2. 如何与k8s .mesos.docker swarm 集成 ...
- oracle系统表的查询
oracle查询用户下的所有表 select * from all_tab_comments -- 查询所有用户的表,视图等select * from user_tab_comments -- 查 ...
- Ambari的API调用
GET api/v1/clusters/HDP/configurations可以获得所有的配置信息(例如,http://hdp0:8080/api/v1/clusters/HDP/configurat ...
- svn服务器端回退版本 (转)
由于误操作,不小心将错误的代码提交到了svn上,于是想在服务器上撤销本次提交,经过尝试,发现进行以下步骤的操作即可彻底删除本次提交: 1.首先找到本次提交后生成的版本号,例如为r224. 2.登录到s ...
- emqtt 3 (我要subscribe 这个topic)
这一次,主要分析client subscribe 某个topic 的处理流程. 由protocol开始 是的,还是要从protocol开始,至于为什么,之前就说过了. subscribe 类型的pac ...
- (转)c#实现开机自启动
RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersio ...
- java代码求分数等级的输出~~~
总结:无论是switch-case-break语句 都不要忘了跳出当前循环,即break; 还有这个输入的分数我如何控制在100以内???? package com.c2; //实现分数等级的输出. ...
- 分布式锁之三:Redlock实现分布式锁
之前写过一篇文章<如何在springcloud分布式系统中实现分布式锁?>,由于自己仅仅是阅读了相关的书籍,和查阅了相关的资料,就认为那样的是可行的.那篇文章实现的大概思路是用setNx命 ...
- dB2 索引相关
ALTER TABLE "XXXX"."tableA" PCTFREE 20 ; CREATE INDEX "schema"."X ...
- mybatis如何防止sql注入(2)
Mybatis框架下SQL注入漏洞修复建议1. 模糊查询like SQL注入修复建议按照新闻标题对新闻进行模糊查询,可将SQL查询语句设计如下:select * from news where ti ...