一.特性(property,setter,deleter)

1.属性:将一个方法伪装成一个属性,在代码级别上没有本质的提升,但是看起来更合理;

class Person:
def __init__(self, height, weight):
self.height = height
self.weight = weight
def bmi(self):
return format(self.weight / (self.height ** 2), '.2f'
p = Person(1.72, 67)
print(p.bmi()) #这里bmi是计算出来的,所以更像是名词,不应该作为方法调用;

所以我们要修改一下,将方法bmi封装成一个属性;

class Person:
def __init__(self, height, weight):
self.height = height
self.weight = weight
@property
def bmi(self):
return format(self.weight / (self.height ** 2), '.2f')
p = Person(1.72, 67)
print(p.bmi)

#property是一种特殊的属性,访问它时会执行一段功能然后返回,试用于能够直接返回值的,通过自己本身计算的,就要把它变成属性方法更合理;

类似的还有求圆的面积和周长;

2.setter可以对属性值进行修改,但是只能传入一个值,deleter可以删除属性的值;

class Person:
def __init__(self,name,age):
self.name = name
self.__age = age if type(age) is int else '你输入有误'
@property
def age(self):
return self.__age
@age.setter
def age(self,r):
self.__age = r if type(r) is int else '你输入有误'
@age.deleter
def age(self):
del self.__age
p = Person('刘博文', 5)
print(p.age)
p.age = 6 #执行setter语句,修改了方法的属性值,只能传入一个参数
print(p.age)
del p.age #执行deleter语句,删除方法里的值

二.类方法

1.两个前面内容:a:不要用类名直接调用方法;因为里面必须得传值给self,

# 类方法
class A:
def func(self): # 普通方法
print(self)
@classmethod # 类方法
def func1(cls):
print(cls)
a1 = A() #可以通过实例化一个对象,
a1.func() #这里不用传值,默认会传入对象本身; A.func(11) #用类调用方法,要传入一个值给self;

这里的类方法,通过类名调用的方法,上面加一个装饰器@classmethod下面的方法就是类方法;

# a1 = A()
# a1.func1() # 对象调用类方法,cls 得到的是类本身.

类方法中的第一个参数约定俗成cls,Python中自动将类名(类空间)传给cls,不管是谁调用类方法,cls指的都是类本身;

a:类方法的应用场景:

1).类中有些方法是不需要对象参与的

class A:
name = 'alex'
count = 1
@classmethod
def func1(cls): # 此方法无需对象参与
return cls.name + str(cls.count + 1)
print(A.func1())

2)这里如果用return A.name + str(A.count + 1)不用cls的话,要是改变一下类名,那底下也得改变;

所以对类中的静态变量进行改变,要用类方法;

 class People:
NAME = 'ALEX'
COUNT = 0 @classmethod
def create_name(cls):
cls.COUNT += 1
print(cls)
print(cls.new(cls)) #2.执行.new函数的时候执行了将cls这个类传给了self
return cls.NAME + str(cls.COUNT) def new(self):
self.age = 10 #3.执行.new方法的时候相当于执行了类.age = 10
return self.age p = People()
print(p.create_name()) #1.对象调用类方法,cls就是接收的是对象所在的类
print(p.__dict__) #4.所以这里面为空字典{}
print(People.__dict__) #5.这里面还有age

3)继承中,父类得到子类的类空间;

#前面说我们父类调用和查找不到子类的空间,但是通过类方法,父类也可以得到子类空间,为所欲为;

class A:
age = 12
@classmethod
def func1(cls): # 这里cls传入的是调用者B,父类得到了子类的空间;
print(cls)
# 对B类的所有的内容可以进行修改.
print(cls.age)
# return cls.name + str(cls.count + 1)
class B(A):
age = 22
B.func1()

#如果没有类方法,你也可以得到子类的所有东西

class A:
age = 12 def func2(self):
print(self) # self 子类的对象,能得到子类 空间的任意值
class B(A):
age = 22
b1 = B()
b1.func2()

这里用self也可以得到子类的东西;但是只能查,不能改;

4)静态方法:

class A:
@staticmethod
def login(username, password):
if username == 'alex' and password == 123:
print('登录成功')
else:
print('登录失败...')
A.login('alex',1234)

def login(username,password):
if username == 'alex' and password == 123:
print('登录成功')
else:
print('登录失败...') login('alex',1234)

这两段代码执行效果一样,虽然你用函数也可以实现,但是这样不合适;

所以类方法的好处就是  1.代码块,清晰  2.提高代码的复用性;

Python_016(面向对象之属性和类方法)的更多相关文章

  1. Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法

    一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在pytho ...

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

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

  3. day25、 静态属性、类方法、静态方法、组合、继承、

    一. 静态属性.类方法.静态方法 1.1静态属性 class Room: def __init__(self,name,owner,width,length): self.name=name self ...

  4. Python - 面向对象(二)类方法、静态方法

    面向对象的各种方法 静态方法 - @staticmethod class Person(): name = "cool guy" @staticmethod def static( ...

  5. 理解JAVA - 面向对象(object) - 属性,方法

    理解JAVA - 面向对象(object) - 属性,方法 多态的体现:    向上造型,父类接收子类对象:向上造型:    从父类角度看不到子类独有的方法:面向对象,人类认知世界的方式:生活中每天都 ...

  6. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  7. django之创建第4-2个项目-访问class类属性和类方法

    1.修改index <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  8. python-面向对象-09_类属性和类方法

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

  9. python 面向对象 私有属性

    __init__构造函数 self.name = name # 属性, 实例变量,成员变量,字段 def sayhi()# 方法, 动态属性 私有属性不对外看到 前面加上__ class role() ...

随机推荐

  1. YARN日志聚合相关参数配置

    日志聚合是YARN提供的日志中央化管理功能,它能将运行完成的Container/任务日志上传到HDFS上,从而减轻NodeManager负载,且提供一个中央化存储和分析机制.默认情况下,Contain ...

  2. java.lang.NoSuchMethodError: org.apache.spark.internal.Logging.$init$(Lorg/apache/spark/internal/Logging;)V

    1.sparkML的版本不对应 请参考官网找到对于版本, 比如我的 spark2.3.3          spark MLlib 也是2.3.3

  3. 深入理解java:2. 多线程机制

    引言 很多人都对其中的一些概念不够明确,如同步.并发等等,让我们先理清一些概念,以免产生误会. 多线程:指的是这个程序(一个进程)运行时,产生了不止一个线程. 并行与并发: 并行:多个cpu实例或者多 ...

  4. Java 向上造型详解

    子类的对象可以向上造型为父类的类型.即父类引用子类对象,这种方式被称为向上造型. 在日常生活中,我们都扮演着不一样的角色.我们有可能是老师,有可能是学生,有可能是……, 但是我们都有共同的属性,例如: ...

  5. gcc编译工具生成动态库和静态库

    一. 库的分类 1.1. 静态库(.a) 1.1.1. 静态库的代码在编译过程中已经被载入可执行程序,因此体积比较大.所以生成的可执行文件就不受库的影响了,即使库被删除了,程序依然可以成功运行. 1. ...

  6. JProfiler> ERROR: Invalid license key. Aborting.

    用IDEA+Tomcat的方式打开JProfiler,出现错误 1,Event Log 出错 16:10 Application Server was not connected before run ...

  7. RabbitMq学习5-路由(Routing)

    一.路由(Routing) 在前面的教程中,我们实现了一个简单的日志系统.可以把日志消息广播给多个接收者. 本篇教程中我们打算新增一个功能——使得它能够只订阅消息的一个字集.例如,我们只需要把严重的错 ...

  8. 1、Java语言概述与开发环境——JDK的安装与环境变量的配置

    Selenium.Appium.Macaca.RobotFramework.Jmeter等框架或工具均必须的一样东西——JDK,也就是基于java开发的东西都要这个东西.JDK的概念在这里不作描述. ...

  9. Python RSA操作

    公钥加密.私钥解密 # -*- coding: utf-8 -*- import rsa # rsa加密 def rsaEncrypt(str): # 生成公钥.私钥 (pubkey, privkey ...

  10. IDEA显示Run Dashboard窗口

    接下来在workspace.xml RunDashBoard节点中添加如下内容:<component name="RunDashboard"> 在代码中加入 <o ...