python面向对象 : 属性, 类方法, 静态方法
一. 属性
属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. property应用 : 类似于bmi这种,area,周长.... 需要用到计算的.
# 求BMI体质数:BMI = 体重(kg)/身高(米)^2 class Person:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height def bmi(self):
bmi = self.weight / self.height ** 2
return '%s的bmi是%s' % (self.name, bmi) p = Person('jack', 55, 1.65)
print(p.bmi()) # jack的bmi是20.202020202020204
class Person:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height @property # 加在需要伪装成属性的方法前面
def bmi(self):
bmi = self.weight / self.height ** 2
return '%s的bmi是%s' % (self.name, bmi) p = Person('jack', 55, 1.65)
print(p.bmi) # 调用方法不用带括号了
# jack的bmi是20.202020202020204
属性的修改
class Person:
def __init__(self, name, age):
self.name = name
# if type(age) is int: # 判断年龄是否为整型
# self.__age = age
# else:
# print('年龄应该输入数字')
self.__age = age if type(age) is int else print('年龄应该输入数字') # 三元表达式 @property
def age(self):
return self.__age @age.setter
def age(self, a):
self.__age = a if type(a) is int else print('年龄应该输入数字') # 判断年龄是否为整型,为整型则把a的值赋值给self.__age p = Person('jack', '') # 输入的年龄不是数字,重新输入
p = Person('jack', 18)
print(p.age)
print(p.__dict__) # {'name': 'jack', '_Person__age': 18}
p.age = 22 # 自动执行@age.setter下面的方法age,并把22传给a
print(p.__dict__) # {'name': 'jack', '_Person__age': 22} # 属性的删除
@age.deleter
def age(self):
del self.__age p = Person('jack', 18)
del p.age # 自动执行@age.deleter下的age函数
print(p.__dict__) # {'name': 'jack'}
二. 类方法
方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。
- 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
- 类方法:由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
- 静态方法:由类调用;无默认参数;
类方法 :
class A:
def func(self): # 普通方法
print(self) @classmethod # 类方法
def func1(cls):
print(cls)
# 普通方法调用
a = A()
a.func() # <__main__.A object at 0x0000022778238160>
A.func(111) # 111 必须传值 # 类方法的调用
a1 = A()
a1.func1() # <class '__main__.A'> 对象调用类方法,传进去的cls是这个对象所属的类空间
A.func1() # 不用传值
# <class '__main__.A'>
类方法的应用场景:
1, 类中有些方法是不需要对象参与.
class A:
name = 'jack'
age = 18 @classmethod
def func1(cls): # 此方法不需要对象参与 cls是所调用的类的空间
print('%s%s岁' % (cls.name, cls.age)) A.func1() # jack18岁
2, 对类中的静态变量进行改变,要用类方法.
class A:
name = 'jack'
age = 18 @classmethod
def func1(cls): # 此方法不需要对象参与
cls.name = 'tom' # 修改类中静态字段的值
print('%s%s岁' % (cls.name, cls.age)) A.func1() # tom18岁
3,继承中,父类得到子类的类空间.
class A:
name = 'tom'
age = 22 @classmethod
def func(cls): # 对传进来的类的所有的内容可以进行修改.
print('%s%s岁' % (cls.name, cls.age)) class B(A):
name = 'jack'
age = 18 B.func() # 执行父类A中的方法func,并把自己的类空间传给cls
# jack18岁
三. 静态方法
静态方法就相当于在类中定义个普通函数,不用传对象,也不用传类名
class A:
@staticmethod
def func(name,age):
print('%s%s岁' % (name, age))
a = A()
a.func('tom', 22) # tom22岁
A.func('jack', 18) # jack18岁
为什么不直接在类外面加个函数
1,代码块.清晰: 把功能都放在一个类里,用着方便
2,复用性. 其它类可以通过继承来获取这个方法
python面向对象 : 属性, 类方法, 静态方法的更多相关文章
- 【学习笔记】--- 老男孩学Python,day18 面向对象------ 属性,类方法,静态方法
属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 应用场景: 类中 要用名词时候可以用@property 比如,求面积,周长,平方,体脂 等运算时候 例如: bmi是名词,最 ...
- python 面向对象:类方法&静态方法
一.类方法 1.1 概念和语法说明 类方法就是针对类对象定义的方法.在类方法内部可以直接访问类属性或者调用其他的类方法 语法如下: @classmethod def 类方法名(cls): pass 说 ...
- Python面向对象之类属性类方法静态方法
类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...
- python的类的 静态属性 类方法 静态方法
一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...
- python__基础 : 类属性,类方法,静态方法
类属性 定义在类里面,方法外面的属性,一般属于这个类,如下面的 num 就是类属性: class Test: num = 类属性用 实例.类属性 或者 类.类属性 都可以访问, 如 a = Te ...
- python - class类 (二) 静态属性/类方法/静态方法
静态属性: #静态属性 = 数据属性 (@property) class mianji(): def __init__(self,x,y): self.x = x self.y = y #类的函数方法 ...
- python 类属性、静态方法与类方法
1. 类属性 1.1 定义 在类中方法外通过属性名 = 属性值定义的属性 访问方式: 类名.属性名 对象名.属性名 class Student: cls_id = 102 stu = Student( ...
- Python的实例方法,类方法,静态方法之间的区别及调用关系
如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...
- python面向对象:类方法
类的方法包括以下几种: 构造方法 :__init__(self,) 析构方法 :__del__(self) 类方法@classmethod.实例方法.静态方法@staticmethod 一.构造方法 ...
随机推荐
- NDK: GCC 4.6 crashes
used version: NDK r9b, arm-linux-androideabi-4.6 GCC, with "-O2 -finline-limit=24". got t ...
- 【java编程】ServiceLoader使用看这一篇就够了
转载:https://www.jianshu.com/p/7601ba434ff4 想必大家多多少少听过spi,具体的解释我就不多说了.但是它具体是怎么实现的呢?它的原理是什么呢?下面我就围绕这两个问 ...
- 2013级计算机学院数字媒体专业李成梁(笛卡尔积,概率树状图)& 学生选课
初中数学问这个向量 ( * , 计算学院 , * , * ) 任取一个向量来自计算机的概率 4*1*100*10000/ 8千万 限定在计科院数字媒体技术专业大二上期选课这个小的范围 学生 ...
- bash常识
文章目录 比较是否相等 = 字符串操作 字符串变量的截取操作 字符串替换 字符串比较 取长度 查找子串的位置 选取子串 fork, exec, source fork exec source 补充 其 ...
- 你不知道的JavaScript(下卷) (Kyle Simpson 著)
第一部分 起步上路 第1章 深入编程 1.1 代码 1.2 表达式 1.3 实践 1.3.1 输出 1.3.2 输入 1.4 运算符 1.5 值与类型 1.6 代码注释 1.7 变量 1.8 块 1. ...
- oracle参数文件与启动过程
oracle随系统启动而启动 cs65-64桌面版orcle-11.2.0.4 启动监听器,后台进程,OEM. 注意: 如果只做一和三,只能启动后台进程,监听器不启动,如果只做二和三,只能启动监听器, ...
- fork和exec
fork pid_t fork(void); 它在调用进程(成为父进程)中返回一次,返回值为新派生进程(成为子进程)的进程ID号 在子进程中又返回一次,返回值为0.因此,返回值本身告知当前进程是子进程 ...
- 将react升级到15之后的坑
问题来源: 运用ant-design 的metion组件必须要使用react 15.x以上的版本,而目前所用的版本是 react 0.14.x版本,所以就不得不对react进行升级 出现的问题: ...
- TypeScript 之 声明文件的使用
https://www.tslang.cn/docs/handbook/declaration-files/consumption.html 下载 在TypeScript 2.0以上的版本,获取类型声 ...
- Linux下Redis开机自启(Centos6)
1.设置redis.conf中daemonize为yes,确保守护进程开启. 查找redis配置文件redis.conf [root@localhost /]# find / -name redis. ...