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 一.构造方法 ...
随机推荐
- python------Json与pickle数据序列化
一.json序列化 xml在被json取代,不同平台之间的语言转换,只能处理简单的.复杂的用pickle: pickle只能在python中用,而在Java中json也可以被识别. info = { ...
- LA3485 Bridge
题意 PDF 分析 以<训练指南>上的分析为准. 二分法时间复杂度\(O(\log v)\) 代码 #include<bits/stdc++.h> #define rg reg ...
- vue 插件tab选项卡(转载)
<template> <tab :options="tabOpt" :state.sync="stateIndex"></tab& ...
- PowerDesigner V16.5 安装及汉化
一.power designer是什么以及是干什么的? power designer是能进行数据库设计的强大的软件,是一款开发人员常用的数据库建模工具.分别从概念数据模型(Conceptual Dat ...
- 用Python免费发短信,实现程序实时报警
进入正文 今天跟大家分享的主题是利用python库twilio来免费发送短信. 先放一张成品图: 代码放在了本文最后的地址中 正文 眼尖的小伙伴已经发现了上面的短信的前缀显示这个短信来自于一个叫Twi ...
- 深入详解美团点评CAT跨语言服务监控(四)服务端消息分发
这边首先介绍下大众点评CAT消息分发大概的架构如下: 图4 消息分发架构图 分析管理器的初始化 我们在第一章讲到服务器将接收到的消息交给解码器(MessageDecoder)去做解码最后交给具体的消费 ...
- 【转】iOS编译OpenSSL静态库(使用脚本自动编译)
原文网址:https://www.jianshu.com/p/651513cab181 本篇文章为大家推荐两个脚本,用来iOS系统下编译OpenSSL通用库,如果想了解编译具体过程,请参看<iO ...
- webpack 入口:entry
定义一个入口点就生成一个chunk.如果你只是用字符串的方式定义了一个入口点,其就被命名为main.如果你用对象的方式定义多个入口点,其就被命名为入口对象中的键值.下面两个例子是等价的: entry: ...
- Springboot配置文件映射
添加类和配置文件的映射: 1.定义映射类 @Component @PropertySource("classpath:config/XX.properties") public c ...
- ubuntu设置开机默认进入字符界面方法 ubuntu 12.04 桌面版关闭图形界面(转)
ubuntu 12.04 桌面版关闭图形界面 注意]改GRUB 的配置文件(不建议直接改 grub.conf) file:/etc/default/grub GRUB_CMDLINE_LINUX_DE ...