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

类方法和静态方法

普通函数

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
下一篇 2017-11-12

相关推荐

  • 用户和组管理 第三周

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 who | cut -d' ' -f1 | sort -u who:查看当前已经登陆的所有用户的详细信息 cut -d ' ' -f1:以空格为界显示每行第一列 sort -u :在输出行中去除重复行。 2、取出最后登录到当前系…

    Linux干货 2017-02-13
  • 第一周的学习总结

       本人是Linux 小白,0基础。加入马帮开始Linux之旅。由于完全不懂Linux,所以在学习的过程中,每课都要看上2遍。接下来说说我第一周所学的内容。 首先是了解到了计算机基础知识,计算机的组成部分、CPU架构类型、其他外围设备。 操作系统基础知识进程管理、内存管理、网络管理、驱动管理、安全管理等。 Linux的起源、发行版以及构…

    Linux干货 2016-02-28
  • N23_第五周

    1.显示/boot/grub/grub.conf中以至少一个空白字符开头的行 egrep “^[[:space:]]{1,}” /boot/grub/grub.conf 2.显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行 egrep “^#[[:space:]]{1,}.*[^[:space…

    Linux干货 2017-02-27
  • xen虚拟机实时迁移

    前言:  xen虚拟机提供了一种类似于heartbeat高可用方案,在保证也不中断的业务情况下实现虚拟机迁移技术。在保证虚拟机上的服务正常的情况下将运行中的Domain迁移到其他机器上,实现xen虚拟机的高可用。 一、实验准备:  (1)各个测试机之间时间要同步  (2)node3提供iscsi网络共享存储  (4)n…

    Linux干货 2015-08-27
  • Linux 系统启动流程及bash 脚本编程练习

    马哥教育网络班23期 第10周课堂练习 Linux 系统启动流程及bash 脚本编程练习1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区; (1)为硬盘新建两个主分区;并为其安装grub; (2)为硬盘的第一个主分区提供内核和ramdisk文件;为第二个分区提供r…

    Linux干货 2017-01-23
  • 对inode的初步理解

    1.什么是inode?     inode中文译作”索引节点“,是linux操作系统中的一种数据结构,用来存储文件的元数据信息。在linux系统中每个文件都会分配一个inode,我们也可以把inode看作指针,它永远指向文件的具体存储位置。 2.inode中包含了什么信息? * inode 编号 * 用来识别文件类型,以及用于 …

    2017-07-18