面向对象的实例方法,类方法和静态方法

类方法和静态方法

普通函数

class Person:
    def normal_method():
        print('normal')

Person.normal_method()
# Person().normal_method()

print(Person.__dict__)

5a0126547e36a94c94000001

  • Person.normal_method()可以,是因为这个方法只是被Person这个名词空间管理的一个普通方法而已,normal_method()只是Person的一个属性而已
  • Person().normal_method()不可以,由于normal_method()在定义的时候没有指定self,所以不能完成实例对象的绑定,所以不能用
  • 虽然语法是对的,但是禁止这么写

实例方法

class Person:
    def method(self):
        return("{}'s method".format(self))

tom = Person()
print(tom.method())

5a014bb87e36a94c94000006


类方法

class Person:
    @classmethod
    def class_method(cls):
        print('class = {0.__name__} ({0})'.format(cls))
        cls.HEIGHT = 179

Person.class_method()
print(Person.__dict__)

5a0128ae7e36a94c94000002

  • 在类定义中,使用@classmethod装饰器修饰的方法
  • 必须至少有一个参数,且第一个参数留给clscls指代调用者即类对象自身
  • 不要修改cls标识符
  • 通过cls可以直接操作类的属性
  • python的类方法,类似于C++、Java中的静态方法

静态方法

class Person:
    @classmethod
    def class_method(cls):
        print('class = {0.__name__} ({0})'.format(cls))
        cls.HEIGHT = 179

    @staticmethod
    def static_method():
        print(Person.HEIGHT)

Person.class_method()
Person.static_method()
print(Person.__dict__)

5a012e537e36a94c94000003

  • 在类定义中,使用@staticmethod装饰器修饰的方法
  • 调用时,不会隐式地传入参数
  • 静态方法,只是表明这个方法属于这个名词空间

方法的调用

class Person:
    def normal_method():
        return('normal')

    def method(self):
        return("{}'s method".format(self))

    @classmethod
    def class_method(cls):
        cls.HEIGHT = 179
        return ('class = {0.__name__} ({0})'.format(cls))

    @staticmethod
    def static_method():
        return (Person.HEIGHT)

print('----类访问-----')
print(1, Person.normal_method())
# print(2, Person.method())    # 报错,因为没有实例化,缺少一个参数,给一个参数就行
print(3, Person.class_method())
print(4, Person.static_method())
print(Person.__dict__, end='\n\n')

print('------实例访问-------')
print('----tom----')
tom = Person()
# print(1,tom.normal_method())   # 报错,多给了self参数
print(2, tom.method())
print(3, tom.class_method())
print(4, tom.static_method(), end='\n\n')

print('----jerry----')
jerry = Person()
# print(1, jerry.normal_method())
print(2, jerry.method())
print(3, jerry.class_method())
print(4, jerry.static_method())

5a0147537e36a94c94000004
5a01476d7e36a94c94000005


总结

  • 类除了实例方法,都可以调用,实例方法需要对象的实例作为第一参数
  • 实例除了普通方法,都可以调用,调用实例方法传入实例自身,静态方法类方法需要传入实例的类

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88299

(0)
nolannolan
上一篇 2017-11-11 16:04
下一篇 2017-11-12 11:23

相关推荐

  • Hadoop集群配置

    通常,集群里的一台机器被指定为 NameNode,另一台不同的机器被指定为JobTracker。这些机器是masters。余下的机器即作为DataNode也作为TaskTracker。这些机器是slaves\ 官方地址:(http://hadoop.apache.org/common/docs/r0.19.2/cn/cluster_setup.ht…

    Linux干货 2015-06-03
  • 用户管理生产环境实践案例

    关于用户管理的命令回顾:visudo 用户管理生产环境实践案例 1. 关于用户管理命令的回顾 2. 正文 关于用户管理的命令回顾: <1> useradd命令 <2> 其他命令 (1)信息收集 (2)模拟用户测试 <1> 问题现状 <2> 需求分析 <3> 实现方针 <4>. 实施过程 …

    Linux干货 2016-10-18
  • 文本处理三剑客之sed

    文本处理三剑客之sed 一、处理文本的工具sed 概念: Stream EDitor, 行编辑器 v sed是一种流编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的内容 ,处理完成后,把缓冲区的内容送往屏幕。接着处理下一 行,这样不断重复,直到文件末尾。文…

    Linux干货 2016-08-12
  • 马哥教育网络班22期+第十周课程练习

    1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)    CentOS系统启动流程为:POST –> BootSequence(BIOS) –> BootLoader(MBR) –> Kernel(ramdisk) –> r…

    Linux干货 2016-12-13
  • 脚本练习

    注:以下脚本练习实验都是以root用户身份执行的,若普通用户运行需要另加相应的权限 1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小。 [root@fengl bin]# vim systeminfo.sh [roo…

    Linux干货 2016-08-15
  • 初识SElinux

    一、SElinux(Secure Enhanced Linux):安全增强的Linux        SElinux是一个在内核中实践的强制访问控制(MAC)安全性机制,由美国国家安全局NSA(The National Security Agency)和SCC(Secure Computing Co…

    Linux干货 2016-09-15