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 一.构造方法 ...
随机推荐
- url中携带中文乱码问题
1.问题描述 在项目中碰见url中经常传递中文参数时,容易出现乱码问题,现在就这个问题产生原因和解决的措施大概分析一下,希望过路人和我能引以为戒. 2.问题分析 由于我们利用URL传递参数这种方式是依 ...
- maven(一)
Maven的简介 什么是maven 是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 Maven好处 普通的传统项目 maven项目 分析:maven项目为什么这么小? ...
- Mongo 3.6.1版本Sharding集群配置
Mongo低版本和高版本的sharding集群配置,细节不太一样.目前网上的配置文档大都是针对低版本的.本人在配置3.6.1版本的mongosharding集群的过程中,碰到不少问题,官方文档没有直观 ...
- 非系统服务如何随系统启动时自动启动(rc.local加了可执行权限,仍然没有生效)
我们知道,例如我们直接yum 安装的httpd mysqld之类的服务可以直接systemctl enable mysql使服务自动启动,但是,我们应该关心的是但是的那部分 例如nginx,我的话,我 ...
- Map的嵌套使用
Map嵌套Map: 例: AAA: Javas班: 001 熊大 002 熊二 Hdoop班 001 小猪猪 002 小菲菲 ★使用增强for循环遍历Set数组: import java.util.H ...
- python Console menu
I just finished a demo which is to provide an easy way to control hardware resources of A sample. Th ...
- js面向对象编程 ---- 系列教程
原 js面向对象编程:数据的缓存 原 js面向对象编程:如何检测对象类型 原 js面向对象编程:if中可以使用那些作为判断条件呢? 原 js面向对象编程:this到底代表什么?第二篇 原 js面向对象 ...
- taro 项目、代码说明
入口文件的生命周期: 入口文件继承自 Component 组件基类,它同样拥有组件生命周期,但因为入口文件的特殊性,他的生命周期并不完整,如下 生命周期方法 作用 说明 componentWillMo ...
- rtmp和http方式在播放flv方面的各自优势和劣势
下面是查的一点资料,比较一下用fms的rtmp和web的http播放flv的差别: 1. 区别 用HTTP方式:先通过IIS 将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播 ...
- 非GUI模式
先启动jmeter的图形界面. 在自动时可以看到控制台输出的信息. 1.提示不用使用GUI进行负载测试. 2.命令行格式. 打开之前保存的百度的测试脚本. 线程数调为100,循环次数是2. R ...