一. 属性

属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 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面向对象 : 属性, 类方法, 静态方法的更多相关文章

  1. 【学习笔记】--- 老男孩学Python,day18 面向对象------ 属性,类方法,静态方法

    属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 应用场景: 类中 要用名词时候可以用@property  比如,求面积,周长,平方,体脂 等运算时候 例如:   bmi是名词,最 ...

  2. python 面向对象:类方法&静态方法

    一.类方法 1.1 概念和语法说明 类方法就是针对类对象定义的方法.在类方法内部可以直接访问类属性或者调用其他的类方法 语法如下: @classmethod def 类方法名(cls): pass 说 ...

  3. Python面向对象之类属性类方法静态方法

    类的结构 实例 使用面向对象开发时,第一步是设计类: 当使用 类名() 创建对象时,会自动执行以下操作: 1.为对象在内存中分配空间--创建对象: 2.为对象的属性 设置初始值--初始化方法(init ...

  4. python的类的 静态属性 类方法 静态方法

    一.静态属性 静态属性说的就是数据属性 1.定义一个房间的类,求下这个房间的面积 class Room: def __init__(self,name,ower,width,length,heigh) ...

  5. python__基础 : 类属性,类方法,静态方法

    类属性  定义在类里面,方法外面的属性,一般属于这个类,如下面的 num 就是类属性: class Test: num = 类属性用 实例.类属性   或者 类.类属性 都可以访问, 如 a = Te ...

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

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

  7. python 类属性、静态方法与类方法

    1. 类属性 1.1 定义 在类中方法外通过属性名 = 属性值定义的属性 访问方式: 类名.属性名 对象名.属性名 class Student: cls_id = 102 stu = Student( ...

  8. Python的实例方法,类方法,静态方法之间的区别及调用关系

    如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...

  9. python面向对象:类方法

    类的方法包括以下几种: 构造方法 :__init__(self,) 析构方法 :__del__(self) 类方法@classmethod.实例方法.静态方法@staticmethod 一.构造方法 ...

随机推荐

  1. linux令普通用户拥有root权限

    如题,平时我们在自己电脑上玩linux,基本都是一个root用户就够了(反正我99%时间都是直接用root用户登录系统),可如果在公司里就不行了,有时候需要多个用户对系统具有root权限,类似与一个系 ...

  2. JSON字符串互相转换的三种方式和性能比较

    C# 对象与JSON字符串互相转换的三种方式 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式. 关于内存对象和JSON字符串的相互转换, ...

  3. Microsoft Bot Framework 上手

    因为这前使用过MS Bot Frameowrk 做过开发, 最近心血来潮想做(挖坑)一个小的bot. 今天带领大家使用MS Bot Framework创建Hello World. 首先,我们要创建项目 ...

  4. day01 计算机的基础知识

    1.编程语言: 人与计算机沟通的表达方式. 2.编程: 程序员用计算机能理解的表达方式(编程语言)把程序员想让计算机实现的功能写到文件里,这些文件称之为程序. 3.计算机硬件组成: 控制器:是计算机的 ...

  5. java 泛型与通配符(?)

    泛型应用于泛型类或泛型方法的声明. 如类GenericTest public class GenericTest<T> { private T item; public void set( ...

  6. Go sql insert update使用举例

    本文结合使用场景简单介绍sql中的insert.update的使用. 以下是代码: 如果记录已经存在,则更新,否则插入新记录. package main import ( "database ...

  7. Hadoop yarn工作流程详解

    yarn是什么?1.它是一个资源调度及提供作业运行的系统环境平台 资源:cpu.mem等 作业:map task.reduce Task yarn产生背景?它是从hadoop2.x版本才引入1.had ...

  8. Xilinx FPGA开发环境vivado使用流程

    Xilinx FPGA开发环境vivado使用流程 1.启动vivado 2016.1 2.选择Create New Project 3.指定工程名字和工程存放目录 4.选择RTL Project 5 ...

  9. 把指定的字符串翻译成 pig latin。

    freecodecamp上的算法题: 把指定的字符串翻译成 pig latin. Pig Latin 把一个英文单词的第一个辅音或辅音丛(consonant cluster)移到词尾,然后加上后缀 & ...

  10. js中return ,return true,return false;区别

    js中return:.return true.return false;区别 转:https://www.cnblogs.com/camikehuihui/p/7999537.html 一.返回控制与 ...