面向对象的各种方法

静态方法 - @staticmethod

class Person():
name = "cool guy" @staticmethod
def static(self):
print("staticmethod", self.name) if __name__ == "__main__":
p = Person()
p.static()

执行结果

    p.static()
TypeError: static() missing 1 required positional argument: 'self'

为什么会报错?

静态方法不能访问实例属性、类属性、实例方法、类方法

静态方法的特别之处

  • 它跟类与对象无关
  • 跟在模块中直接定义普通函数没有什么区别,只是把“静态方法”放到了类里面,所以只能设置形参
  • 只能通过 类名.静态方法 来调用

正确调用写法

class Person():
name = "cool guy" @staticmethod
def static(name):
print("staticmethod", name) if __name__ == "__main__":
p = Person()
Person.static(p.name)

执行结果

staticmethod cool guy

类方法 - @classmethod

class person:
name = "cool man" @classmethod
def class_m(cls):
print("--第一个类方法--", id(cls))
print("--第一个类方法--", cls.name)
cls.self_m(cls)
cls.class_m2() def self_m(self):
print("--实例方法--", id(self))
print("--实例方法--", self.name) @classmethod
def class_m2(cls):
print("--第二个类方法--", id(cls)) p = person()
p.name = "bad boy" # 绑定实例属性
p.class_m()
person.class_m()

执行结果

--第一个类方法-- 2381398112712
--第一个类方法-- cool man
--实例方法-- 2381398112712
--实例方法-- cool man
--第二个类方法-- 2381398112712
--第一个类方法-- 2381398112712
--第一个类方法-- cool man
--实例方法-- 2381398112712
--实例方法-- cool man
--第二个类方法-- 2381398112712

知识点

  • 类方法内部可以直接访问类属性、类方法、实例方法
  • cls 可以理解成类对象的引用,哪一个类对象调用的方法, cls 就是哪个一个类的引用, 类对象.类方法 ;和实例方法中的 self 很像, 实例对象.实例方法
  • 调用其他类方法时,不用传递cls参数;但调用其他实例方法时,需要传递cls参数
  • 在类方法内部调用的实例方法,接收的是一个类对象而不是实例对象,当实例对象绑定实例属性时,在实例方法中打印的仍然是类属性;表明类方法无法访问实例属性
  • 一个类只有一个类对象,即使通过实例对象调用类方法,传递的仍然是类对象的引用,所有类方法都被同一个类对象调用

思考题

如果方法内部 即需要访问 实例属性,又需要访问 类属性,应该定义成什么方法?

答案:实例方法,因为可以通过  类对象.类属性 来访问,但在类方法中无法访问实例属性

class Person:
name = "cool man" def self_m(self):
Person.name = "yep"
print(self.name) p = Person()
p.name = "bad boy" # 绑定实例属性
p.self_m()
Person.self_m(Person)

执行结果

bad boy
yep

知识点

类对象调用实例方法时,需要传递类对象

Python - 面向对象(二)类方法、静态方法的更多相关文章

  1. python面向对象 : 属性, 类方法, 静态方法

    一. 属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. property应用 : 类似于bmi这种,area,周长.... 需要用到计算的.   # 求BMI体质数:BMI = 体 ...

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

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

  3. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

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

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

  5. [b0016] python 归纳 (二)_静态方法和类方法

    # -*- coding: UTF-8 -*- """ 测试 类的静态方法,类方法 @staticmethod @classmethod 总结: 1. self 指向类对 ...

  6. python面向对象二

    1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Stud ...

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

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

  8. python面向对象:类方法

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

  9. python 面向对象二 类和实例

    一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...

  10. python 面向对象(二)成员

    ##################################总结########################### 类的成员: 变量: 实例变量      对象.属性=xxx 类变量    ...

随机推荐

  1. java处理数据库date类型数据

    1.使用Date类和TimeStamp类的valueOf转换时间   Date.valueOf();   TimeStamp.valueOf();   如果这两种转换直接用在sal语句上,那么最外层要 ...

  2. Hadoop的存储架构介绍

    http://lxw1234.com/archives/2016/04/638.htm 该文章介绍了Hadoop的架构原理,简单易懂. 目前公司提供Hadoop的运算集群BMR,可以直接申请集群资源.

  3. 关于log4j中log4j.properties和log4j.xml的加载顺序

    如果采用log4j输出日志,要对log4j加载配置文件的过程有所了解. log4j启动时,默认会寻找source folder下的log4j.xml配置文件,若没有,会寻找log4j.properti ...

  4. linux查看端口号占用命令-netstat

    题记 经常会发现,很多时候我们在运行一些带有端口的程序时,程序经常会报端口被占用的问题,比如Tomcat 8080,端口起不来. 查看端口号 netstat 如果发现某个端口被占用后,可以用命令查看, ...

  5. 不同浏览器Cookie大小

    一.浏览器允许每个域名所包含的 cookie 数:Microsoft 指出 Internet Explorer 8 增加 cookie 限制为每个域名 50 个,但 IE7 似乎也允许每个域名 50 ...

  6. PS4游戏将登陆PC:一曲属于主机的悲歌

    ​​ ​ 曾经,红白机.PS游戏机等成为一代人难以磨灭的记忆.而随后的索尼PS3.微软Xbox 360.任天堂Wii U等,也称霸了次时代主机时代,成为家庭娱乐的中心.但面对着依托于PC和智能移动终端 ...

  7. oracle监控参数

    Sar –u 检查CPU的繁忙程度列说明Usr用户模式下cpu运行所占的百分比Sys系统模式下cpu运行所占的百分比Wio因为有进程等待块I/O而使cpu处于闲置状态所占百分比IdleCpu为闲置状态 ...

  8. JS实现总价随数量变化而变化(顾客购买商品表单)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:test.html * 作者:常轩 * 微信公众号:Worldh ...

  9. Spring Cloud 是什么

    概念定义 Spring Cloud 是一个服务治理平台,提供了一些服务框架.包含了:服务注册与发现.配置中心.消息中心 .负载均衡.数据监控等等. Spring Cloud 是一个微服务框架,相比 D ...

  10. 解决getImageData跨域问题

    在项目开发过程中要用到html5增加的getImageData方法来实现刮刮卡的效果,后台上传图片,手机端用手刮.在本地开发没遇到问题,上线之后发现刮不了,提示"Uncaught Secur ...