一、静态属性

静态属性说的就是数据属性

1、定义一个房间的类,求下这个房间的面积

class Room:
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
print(r1.__dict__)#查看下r1这个实例的属性字典
print("%s 住的%s 总面积是%s平米的地下室" %(r1.Ower,r1.Name,r1.Width*r1.Length))#进行字符串拼接 C:\python35\python3.exe D:/pyproject/day25/静态属性.py {'Length': 2, 'Ower': '北爷', 'Name': '厕所', 'Heigh': 20000, 'Width': 2} 北爷 住的厕所 总面积是4平米的地下室

2、又来了一个人,又要求下他的房子的面积

class Room:
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
# print(r1.__dict__)#查看下r1这个实例的属性字典
print("%s 住的%s 总面积是%s平米的地下室" %(r1.Ower,r1.Name,r1.Width*r1.Length))#进行字符串拼接
print("%s 住的%s 总面积是%s平米的地下室" %(r2.Ower,r2.Name,r2.Width*r1.Length)) C:\python35\python3.exe D:/pyproject/day25/静态属性.py 北爷 住的厕所 总面积是4平米的地下室 喵爷 住的北京 总面积是40平米的地下室

3、我们这样做肯定是不行的。这相当于是在外面完成的这件事情,而且很麻烦,应该把这个计算面积弄成一个函数

class Room:
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
def cal_area(self):
print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)#实例化第二个实例
r1.cal_area()#实例调用类的函数属性会自动传实例本身作为参数
r2.cal_area()#实例调用类的函数属性会自动传实例本身作为参数 C:\python35\python3.exe D:/pyproject/day25/静态属性.py 北爷 住的厕所 总面积是4平米的地下室 喵爷 住的北京 总面积是1200平米的地下室

4、property装饰器

class Room:
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
@property #把一个方法变成一个数据属性
def cal_area(self):
print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
r1.cal_area#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
r2.cal_area C:\python35\python3.exe D:/pyproject/day25/静态属性.py 北爷 住的厕所 总面积是4平米的地下室 喵爷 住的北京 总面积是1200平米的地下室

5、这样还不行。因为正常的数据属性直接运行是没有返回值的

6、现在改为了直接return一个返回值,现在用起来的效果就是跟调用数据属性是一模一样的了,property这个装饰器就是把类的函数属性变为数据属性,也就是封装成了数据属性

class Room:
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
@property #把一个方法变成一个数据属性
def cal_area(self):
# print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
# return (self.Width * self.Length)
return "%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
print(r1.cal_area)#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
print(r2.cal_area)
print(r1.Name)#调用r1这个实例的数据属性
print(r2.Name)#调用r2这个实例的数据属性 C:\python35\python3.exe D:/pyproject/day25/静态属性.py 北爷 住的厕所 总面积是4平米的地下室 喵爷 住的北京 总面积是1200平米的地下室 厕所 北京

7、算是完美了,我们在增加一个计算体积的,当做是练习一下

class Room:
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
@property #把一个方法变成一个数据属性
def cal_area(self):
# print("%s 住的%s 总面积是%s平米的地下室" %(self.Ower, self.Name, self.Width * self.Length))
# return (self.Width * self.Length)
return "%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)
@property
def cal_tiji(self):
return "%s 住的%s 总体积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length * self.Heigh)
r1=Room("厕所","北爷",2,2,20000)#实例化出来一个实例r1,实例化的过程就是执行__init__
r2=Room("北京","喵爷",20,60,20000)
r3=Room("西安","修电脑",20,60,20000)
print(r1.cal_area)#用了property这个装饰器之后,实例在调用函数属性就等于调用数据属性,不用加()就可以调用
print(r2.cal_area)
print(r3.cal_tiji) C:\python35\python3.exe D:/pyproject/day25/静态属性.py 北爷 住的厕所 总面积是4平米的地下室 喵爷 住的北京 总面积是1200平米的地下室 修电脑 住的西安 总体积是24000000平米的地下室

二、类方法

1、类是怎么调用自己的数据属性呢

class Room:
tag=1#定义一个类的数据属性
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
@property #把一个方法变成一个数据属性
def cal_area(self):
return "%s 住的%s 总面积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length)
@property
def cal_tiji(self):
return "%s 住的%s 总体积是%s平米的地下室" % (self.Ower, self.Name, self.Width * self.Length * self.Heigh)
print(Room.tag) C:\python35\python3.exe D:/pyproject/day25/静态属性.py 1

2、由于self把类和实例绑定到一起了,所以我们的折中方案就是先生成一个实例,然后在用类去调用方法,把实例手动穿进去

class Room:
tag=1#定义一个类的数据属性
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
def tell_info(self):
print("---->",self.tag)
r1 = Room("厕所", "北爷", 2, 2, 20000)
Room.tell_info(r1)#类调用类的函数属性的时候需要手动传实例本身 C:\python35\python3.exe D:/pyproject/day25/静态属性.py 1 ----> 1

3、但是我如果只想执行类的方法,不想跟任何实例有捆绑,该怎么做呢,python给我们提供了classmethod这个装饰器,只要用了这个方法, 就表示这个装饰器下面的方法是专门给类用的

这个方法就是只是类在调用类的方法,跟实例没关系,只要加了classmethod就只能供类调用

class Room:
tag=1#定义一个类的数据属性
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
@classmethod#这个装饰器是专门供类使用的方法
def tell_info(cls):#cls代表类本身
print(cls)
print("---",cls.tag)#等价于Room.tag
Room.tell_info()#会自动把类本身传给cls C:\python35\python3.exe D:/pyproject/day25/静态属性.py <class '__main__.Room'> --- 1

三、静态方法 叫类的工具包,不跟类绑定也不跟实例绑定

class Room:
tag=1#定义一个类的数据属性
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
@classmethod#这个装饰器是专门供类使用的方法
def tell_info(cls):#cls代表类本身
print(cls)
print("---",cls.tag)
@staticmethod#静态方法 叫类的工具包,不跟类绑定也不跟实例绑定
def wash_body(a,b,c):
print("%s %s %s 正在洗澡" %(a,b,c))
Room.wash_body("北爷","喵爷","修电脑")#用类调用washbody这个方法
r1=Room("厕所","北爷",2,2,20000)#实例化一个实例r1
r1.wash_body("北爷","喵爷","修电脑")#用实例调用washbody这个方法 C:\python35\python3.exe D:/pyproject/day25/静态方法.py 北爷 喵爷 修电脑 正在洗澡 北爷 喵爷 修电脑 正在洗澡

查看下 这个静态方法是不是存到了类的属性字典里面

class Room:
tag=1#定义一个类的数据属性
def __init__(self,name,ower,width,length,heigh):
self.Name=name
self.Ower=ower
self.Width=width
self.Length=length
self.Heigh=heigh
@classmethod#这个装饰器是专门供类使用的方法
def tell_info(cls):#cls代表类本身
print(cls)
print("---",cls.tag)
@staticmethod#静态方法 叫类的工具包,不跟类绑定也不跟实例绑定
def wash_body(a,b,c):
print("%s %s %s 正在洗澡" %(a,b,c))
Room.wash_body("北爷","喵爷","修电脑")#用类调用washbody这个方法
print(Room.__dict__)#查看下静态方法 结果是定义到了类的属性字典里面了

总结:

静态属性:property类和实例都可以访问静态属性

(把函数封装成一个数据属性,让外面的人感受不  到是调用的函数属性)

类方法:  classmethod只能类访问类方法,不能用实例访问类方法

静态方法:staticmethod 用类可以调用静态方法,实例也可以调用静态方法

不跟类和实例绑定,只叫类的工具包

python的类的 静态属性 类方法 静态方法的更多相关文章

  1. python - class类 (二) 静态属性/类方法/静态方法

    静态属性: #静态属性 = 数据属性 (@property) class mianji(): def __init__(self,x,y): self.x = x self.y = y #类的函数方法 ...

  2. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  3. Class的使用,构造方法,实例属性和实例方法,静态属性和静态方法,this和super关键字,类的继承

    s6新增了一种定义对象实例的方法,Class(类)这个概念,作为对象的模板.class可以看作只是一个语法糖,通过class关键字,可以定义类.让对象原型的写法更加清晰.更像面向对象编程的语法. 一. ...

  4. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  5. PHP static静态属性和静态方法

    这里分析了php面向对象中static静态属性和静态方法的调用.关于它们的调用(能不能调用,怎么样调用),需要弄明白了他们在内存中存放位置,这样就非常容易理解了.静态属性.方法(包括静态与非静态)在内 ...

  6. php面向对象中static静态属性和静态方法的调用

    这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下 本文实例讲述了php中static静态属性和静态 ...

  7. php静态属性和静态方法

    php静态属性和静态方法 2012-09-29 10:18 1518人阅读 评论(0) 收藏 举报 phpfunction 本php教程主要是学习php中静态属性和静态方法的使用方法和基本的示例. · ...

  8. static静态属性和静态方法的原理与调用技巧

    这篇文章主要介绍了php面向对象中static静态属性和静态方法的调用,实例分析了static静态属性和静态方法的原理与调用技巧,需要的朋友可以参考下     本文实例讲述了php中static静态属 ...

  9. PHP使用static关键字声明静态属性和静态方法

    PHP使用static关键字声明静态属性和静态方法 在PHP中,通过static关键字修饰的成员属性和成员方法被称为静态属性和静态方法. 静态属性和静态方法不需要在被类实例化的情况下就可以直接使用. ...

随机推荐

  1. 同步、异步、回调执行顺序之经典闭包setTimeout分析

    聊聊同步.异步和回调 同步,异步,回调,我们傻傻分不清楚, 有一天,你找到公司刚来的程序员小T,跟他说:“我们要加个需求,你放下手里的事情优先支持,我会一直等你做完再离开”.小T微笑着答应了,眼角却滑 ...

  2. 初级字典树查找在 Emoji、关键字检索上的运用 Part-1

    系列索引 Unicode 与 Emoji 字典树 TrieTree 与性能测试 生产实践 前言 通常用户自行修改资料是很常见的需求,我们规定昵称长度在2到10之间.假设用户试图使用表情符号 ‍

  3. 外网主机访问虚拟机下的web服务器(NAT端口转发)-----端口映射

    主机:系统win7,ip地址172.18.186.210 虚拟机:VMware Workstation 7,虚拟机下安装了Centos操作系统,ip地址是192.168.202.128,部署了LAMP ...

  4. unity物理检测的几种方式

    (由于本人大多做2d游戏,因此以下以2d为主介绍,但是具体和3d相差不大) 在unity中有很多不同的物理检测方式,但是大致可以分为以下几种: 1.Physics2d检测系列 Physics2d.Li ...

  5. java算法面试题

    前言:线上面试题与大家分享,并记录求职道路的酸甜苦辣,特此留念. 李雷和韩梅梅坐前后排,上课想说话怕被老师发现,所以改为传小纸条.为了不被老师发现他们纸条上说的是啥,他们约定了如下方法传递信息:将26 ...

  6. Daily Scrumming* 2015.12.17(Day 9)

    一.团队scrum meeting照片 二.成员工作总结 姓名 任务ID 迁入记录 江昊 任务1077 https://github.com/buaaclubs-team/temp-front/com ...

  7. 《Linux内核设计与实现》 第一、二章学习笔记

    第一章 Linux内核简介 一.Unix 1.Unix的特点 简洁 绝大部分东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),wr ...

  8. 祝贺自己操作系统JAVA项目有进展!!

    先公布研发过程的心得吧!!! ^_^ /** * 作者:范铭祥 * 内容及功能: 显示框创造1.0 * 我将在这个类里 一:面板1:用来先显示一副图表示顺序和处理中 * 二:面板2:类1:用来显示要处 ...

  9. Where To Buy -- proposed by Renqian Luo

    Need 周末在公司加班,公司食堂不开饭,就会想到点外卖.手机里好多外卖APP,同样的店家在不同平台的优惠活动可能不一样,A这边满20减10,B那边满20只减5,但是那边好像有优惠券可以用唉,等等,C ...

  10. c++中队列queue和栈stack的基本操作

    1.queue 模板类的定义在<queue>头文件中. 定义queue 对象的示例代码如下:queue<int> q1;queue<double> q2; queu ...