Python开发【第七章】:Python面向对象进阶

静态方法

  通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

#静态方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @staticmethod    # 把eat方法变为静态方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat()

# Traceback (most recent call last):
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/staticmothod.py", line 16, in <module>
#     p.eat()
#TypeError: eat() missing 1 required positional argument: ‘self‘

上面的调用会出以下错误,说是eat需要一个self参数,但调用时却没有传递,没错,当eat变成静态方法后,再通过实例调用时就不会自动把实例本身当作一个参数传给self了。

想让上面的代码可以正常工作有两种办法

  • 调用时主动传递实例本身给eat方法,即p.eat(p)
  • 在eat方法中去掉self参数,但这也意味着,在eat中不能通过self.调用实例中的其它变量了
#静态方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @staticmethod    # 把eat方法变为静态方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat(p)

#LianZhiLei is eating

#静态方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @staticmethod    # 把eat方法变为静态方法
    def eat():
        print("is eating")

p= Schoolmate("LianZhiLei")
p.eat()

#is eating

  

类方法

  类方法顾名思义跟类有关,类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

#类方法
class Schoolmate(object):
    def __init__(self, name):
        self.name = name

    @classmethod   # 把eat方法变为类方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat()

# Traceback (most recent call last):
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/classmothod.py", line 15, in <module>
#     p.eat()
#   File "C:/Users/L/PycharmProjects/s14/class/Day7/classmothod.py", line 12, in eat
#     print("%s is eating" % self.name)
# AttributeError: type object ‘Schoolmate‘ has no attribute ‘name‘

执行报错如下,说schoolmat没有name属性,这是因为name是个实例变量,类方法是不能访问实例变量的,只能访问类变量

#类方法
class Schoolmate(object):
    name = ("Schoolmat的类变量")
    def __init__(self, name):
        self.name = name

    @classmethod   # 把eat方法变为类方法
    def eat(self):
        print("%s is eating" % self.name)

p= Schoolmate("LianZhiLei")
p.eat()

# Schoolmat的类变量 is eating

此时可以定义一个类变量,变量名为name即可解决

属性方法

  属性方法的作用就是通过@property把一个方法变成一个静态属性,这个蛮有用的,后面课程会涉及到,先看代码

时间: 2024-10-24 23:38:52

Python开发【第七章】:Python面向对象进阶的相关文章

Python开发基础-Day22反射、面向对象进阶

isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象,如果是返回True 1 class Foo(object): 2 pass 3 obj = Foo() 4 print(isinstance(obj, Foo)) issubclass(sub, super)检查sub类是否是 super 类的派生类,如果是返回True 1 class Foo(object): 2 pass 3 cla

第七章、面向对象分析

第七章.面向对象分析1.分析类,可划分为实体类.边界类和控制类种类型.  a.实体类:表示系统储存和管理的永久信息.  b.边界类:表示参与者与系统之间的交互.  c.控制类:表示系统在运行过程中的业务控制逻辑.2.面向对象的思想主要包括:   继承 多态 封装          封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部.   继承:子类拥有父类的所有数据和操作.        多态:一个程序中同名的不同方法共存的情况.      有两种形式的多态–

一个新手的Python自学之旅 #MacBook #《“笨办法”学Python》#第七章:字符串、文本、各种打印、转义序列、手动输入raw_input()

第七章预告:字符串.文本.各种打印.转义序列.手动输入raw_input() ------------------------------------<习题6:字符串和文本>--------------------------------------- 在这里还时有必要详细介绍一下字符串以及和格式化字符之间的应用: 字符串:通常是指需要展示给别人的或者是想要从程序里“导出”的一小段字符,吧啦吧啦吧啦吧啦,是不是觉得挺拗口的,不如举个例子来的实在. 在ex1.py的这段代码print "

转 《python开发_常用的python模块及安装方法》

http://www.cnblogs.com/hongten/p/hongten_python_more_modules.html adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheetahcherrypy:一个WEB frameworkctypes:用来调用动态链接库DBUtils:数据库连接池django:一个WEB frameworkdocutils:用来写文档的dpkt:数据包的解包和组包MySQLdb:

安卓移植和驱动开发第七章心得体会

第七章 Led为我闪烁 尽管 Linux 驱动直接与硬件打交道,但并不是 Linux 驱动直接向硬件中的内存写数据, 而是与本机的内存(νO Memory,位于内核空间〉进行交互.所谓 1/0 内存是通过各种接口(PCI.USB.蓝牙.以太网口等〉连接到主机( PC.手机〉的硬件〈网卡.声卡.摄像头等〉在主机内 存中的映射.例如,在 Ubuntu Linux 上运行的驱动只需要访问运行 Ubuntu Linux 的主机中的内存即可,然后Linux内核会利1/0内存中的数据硬件交互. 如果在不同L

Android深度探索HAL与驱动开发-——第七章

第七章主要介绍了嵌入式组态软件结构,.界面设计和功能选择区设计以及辅助功能区设计和程序生成区设计Android应用并采用Java开发嵌入式.   Android嵌入式是通过拖拽式进行程序设计,双击指定组件和调整组件属性完成的. Androd界面设计.包括布局.组件的使用.android嵌入式组态软件功能选择区设计包括界面设计.IO设计和数据库设计.   1.界面设计:分为六个模块,布局.按钮类.文本类.时间类.特殊类.属性组成.(1)布局类中包括绝对布局.框架布局和线性布局:(2)按钮类包括普通

Android深度探索HAL与驱动开发 第七章

第七章 本章学习控制发光二极管,通过直接与硬件交互完成,控制开发板上的四个小灯. LED驱动的实现原理是 理解了原理之后,我们便可以开始编写led驱动了,与上一章步骤类似,通过命令和读写文件实现.首先创建led驱动的设备文件,可以使用cdev_init,register_chrdev_region,cdev_add等建立主设备号的设备文件.步骤如下: 1使用cdev_init初始化cdev 2指定设备号 3使用cdev_add函数将字符设备添加到内核中的字符设备组中 4使用class_creat

Android深度探索(卷一)HAL与驱动开发 第七章

通过学习Android深度探索(卷一)HAL与驱动开发的第七章让我了解了如何通过驱动程序来控制发光二极管,实现驱动直接与硬件交互. 一个完整的Linux驱动主要由内部处理和硬件交互两部分组成,其中内部处理主要是指Linux驱动的装载.卸载.与设备文件相关的动作处理以及业务逻辑等:与硬件交互主要是指通过函数与硬件中的寄存器进行数据交互. LED驱动的实现原理:尽管Linux驱动直接与硬件打交道,但并不是Linux驱动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互.每一个连接Linux的硬

win7安装python开发环境,运行python

在win7上安装python的开发环境是非常简单的事情 Step1:下载python安装文件 url:https://www.python.org/download 去这里找到你想要下载的文件 Step2:安装 windows上当然是傻瓜式安装了,你还在纠结什么呢 Step3:配置环境变量 我的电脑-> 高级设置 -> 环境变量 ->path -> :python安装路径 Ok啦 进入命令行window+R输入python显示如下 C:\Users\YiXian>python

Android深度探索(卷1)HAL与驱动开发 第七章 LED将为我闪烁:控制发光二极管

第七章  LED将为我闪烁:控制发光二极管 读书心得    LED驱动的实现原理 尽管Linux驱动程序直接与硬件打交道,但并不是Linux驱动直接向硬件中的内存写数据,而是与本机的I/O内存进行交互. 编写LED驱动 测试LED驱动 LED驱动的移植 在修改Linux驱动的源代码时,应尽量不要修改Linux驱动的借口. LED驱动是本书第一个真正和硬件打交道的Linux驱动,虽然LED驱动并不复杂,只是控制了四个LED,但是LED驱动已经包括了Linux驱动所有必要的部分.一个完整的Linux