静态方法(@staticmethod)

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

class Dog(object):
def __init__(self,name):
self.name = name def eat(self,food):
print("%s is eating %s" %(self.name,food)) d = Dog("chenronghua")
d.eat("包子")
运行结果如下:
chenronghua is eating 包子

上面我们创建了一个类,代码也能够正常执行。下面,在eat()方法上加静态方法。

class Dog(object):
def __init__(self,name):
self.name = name @staticmethod #加上静态方法
def eat(self,food):
print("%s is eating %s" %(self.name,food)) d = Dog("chenronghua")
d.eat("包子")
运行如下:
Traceback (most recent call last):
  File "/home/zhuzhu/第七天/static_method.py", line 10, in <module>
    d.eat("包子")
TypeError: eat() missing 1 required positional argument: 'food'

从上面运行结果可以看出,加上@staticmethod之后,代码就执行错误了,提示eat()少了一个参数。

下面我们给eat()方法传入两个参数,如下:

class Dog(object):
def __init__(self,name):
self.name = name @staticmethod
def eat(self,food):
print("%s is eating %s" %(self,food)) d = Dog("chenronghua")
d.eat("chenronghua","包子")
运行如下:
chenronghua is eating 包子

从上面结果可以看出,加入参数之后,执行eat()方法是没有问题的,从中可以看出,加上@staticmethod之后,eat()变成静态方法了,本来eat()方法是能够接收self.name中类的属性的,现在不可以了,只能自己传递参数进来,说明跟类没有太多关系了,截断了与类的关系,eat()成为一个单独的函数,要自己传递函数,与类没有太多的关系,但是必须通过类来进行调用,不能独自在外面调用,必须通过类来进行调用,@staticmethod方法与我们跟台湾的关系一样,名义上属于中国,但是大陆有管不了台湾。名义属于,但是不能调用。

静态方法:只是名义上归类管理,实际上静态方法里访问不了类或实例中的任何属性。

类方法

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

class Dog(object):
def __init__(self,name):
self.name = name @classmethod
def eat(self):
print("%s is eating" %self.name) def talk(self):
print("%s is talking" %self.name) d = Dog("chenronghua")
d.eat()
运行结果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/第七天/class_method.py", line 14, in <module>
    d.eat()
  File "/home/zhuzhu/第七天/class_method.py", line 7, in eat
    print("%s is eating" %self.name)
AttributeError: type object 'Dog' has no attribute 'name'

上面代码中,我们把@staticmethod换成@classmethod,我们知道@staticmethod是把类方法变成单独的函数,只能通过传递参数,名义上属于类,但是不能调用类中的属性和方法,现在@calssmethod也报错,说Dog类中没有name属性,我们知道,我们在里面定义了名字,说明@calssmethod也对类进行了修改。不能直接调用实例的属性。

class Dog(object):
n =
def __init__(self,name):
self.name = name @classmethod
def eat(self):
print("%s is eating" %self.n) def talk(self):
print("%s is talking" %self.name) d = Dog("chenronghua") d.eat()
运行结果如下:
666 is eating

从上面可以看出,@classmethod是让类方法只能调用类的属性,不能调用实例的属性,类方法的作用就是这个。不能在调用实例属性。

类方法:类方法只能方位类变量,不能访问实例变量

属性方法

属性方法的作用就是通过@property把一个方法变成一个静态属性

class Dog(object):

    def __init__(self,name):
self.name = name @property #属性,attribute
def eat(self):
print("%s is eating" %self.name) def talk(self):
print("%s is talking" %self.name) d = Dog("chenronghua") d.eat()
运行结果如下:
chenronghua is eating
Traceback (most recent call last):
  File "/home/zhuzhu/第七天/property属性.py", line 15, in <module>
    d.eat()
TypeError: 'NoneType' object is not callable

上面,我们在eat()方法上面加上@property,可以看出,还是不能执行的,说NoneType不能调用。下面,我们去掉调用的括号,如下:

class Dog(object):

    def __init__(self,name):
self.name = name @property #属性,attribute
def eat(self):
print("%s is eating" %self.name) def talk(self):
print("%s is talking" %self.name) d = Dog("chenronghua") d.eat
运行结果如下:
chenronghua is eating

从上面可以看出,代码执行没有错误,正常执行,说明@property是把方法变成了属性,本来方法eat()是要加括号才能执行的,现在不要加括号就可以执行,变成了一个方法。那么遇到参数的情况要怎么办呢?

class Dog(object):

    def __init__(self,name):
self.name = name @property #属性,attribute
def eat(self,food):
print("%s is eating" %self.name) def talk(self):
print("%s is talking" %self.name) d = Dog("chenronghua") d.eat = "dd"
运行结果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/第七天/property属性.py", line 15, in <module>
    d.eat = "dd"
AttributeError: can't set attribute

属性是不能传入参数的,也不能设置属性。

class Dog(object):

    def __init__(self,name):
self.name = name @property #属性,attribute
def eat(self,food):
print("%s is eating" %self.name) def talk(self):
print("%s is talking" %self.name) @eat.setter
def eat(self,food):
print("set to food:",food) d = Dog("chenronghua") d.eat = "dd"

@property是把类方法变成属性,通过属性进行调用,要先传值,比如在定义一个同名函数@eat.setter就能实现对实例传值d.eat = "dd"。

每个人都有自己的道路,不要羡慕别人,路不止一条,很多时候,我们走的路都是错的,都是按照别人的要求走的路,我们要走自己的路,一步一步。不要跟别人对比。相信努力坚持总会有收获,收获大小没关系,不是每个人都是能称为比尔盖茨。我们每个人都没有资格评论别人的生活,快乐不快乐不是一个人能够去评论的。不要去指导别人。生活没有对与错,有些目标能够实现只要自己坚持,有些目标即便自己坚持也是实现不了的。比如完美的身材,只要通过坚持锻炼,都会得到大块肌肉,没有赘肉的身体。这个世界,永远都是百分之二十的人掌握百分之八十的财富。这个任何人改变不了,即便在努力很多人也达不到。只能坚持不懈,不断改变自己。即便永远成功不了,但是我们能在不断努力的道路上不断完善自己,提升自己。没必要羡慕别人的成功,只要自己在成长,在不断努力,不断前进,走好自己的人生就好。

属性方法

把一个方法变成一个静态属性

day7面向对象--进阶的更多相关文章

  1. day7 面向对象进阶

    面向对象高级语法部分 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例 ...

  2. Python之路,Day7 - 面向对象编程进阶

    本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个支持多用户在线的FTP程序 经典类vs新式类 把下面代 ...

  3. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  4. day26、面向对象进阶:多态、封装、反射

    一.多态 什么是多态: 类的继承有两层意义:1.改变 2.扩展 多态就是类的这两层意义的一个具体的实现机. 即:调用不同类实例化的对象,下的相同的方法,实现的过程不一样 python中的标准类型就是多 ...

  5. Python-Day7 面向对象进阶/异常处理/Socket

    一.面向对象高级语法部分 1.静态方法     通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里 ...

  6. python 自动化之路 day 08 面向对象进阶

    面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 面向对象高级语法部分 经典类vs新式类 把下面代码用python2 和python3都执行一下 1 2 ...

  7. Python【第七篇】面向对象进阶

    大纲 一.面向对象高级语法 1.静态方法.类方法.属性方法 2.类的特殊成员方法 3.反射 二.异常处理 三.网络编程之socket基础 一.面向对象高级语法 1.静态方法:名义上归类管理,实际上静态 ...

  8. Python开发【第七篇】:面向对象 和 python面向对象进阶篇(下)

    Python开发[第七篇]:面向对象   详见:<Python之路[第五篇]:面向对象及相关> python 面向对象(进阶篇)   上一篇<Python 面向对象(初级篇)> ...

  9. python基础——面向对象进阶下

    python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...

随机推荐

  1. 算法习题-FFT

    Q1(hdu1402): 给出两个很大的数字A,B,计算二者乘积. 分析:这个题目java应该能过,用FFT做能够加速计算.这里将字符串A按权(10进制)展开,前面的系数就是多项式的系数,这样就构造出 ...

  2. Linux文件系统_每一个的意义

    2017年1月10日, 星期二 Linux文件系统_每一个的意义 rootfs: 根文件系统 FHS:Linux /boot: 系统启动相关的文件,如内核.initrd,以及grub(bootload ...

  3. redis 批量删除keys

    “mf*” 为你的key  redis-cli -h 127.0.0.1 -p 6379 -a yourpassword keys “mf*” |xargs  redis-cli -h 127.0.0 ...

  4. 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏

    <HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...

  5. 【Linux】SecureCRT连接Linux乱码

    SecureCRT连接linux出现乱码问题.解决方法. 打开SecureCRT-->option-->Session option

  6. Xilinx Altera FPGA中的逻辑资源(Slices VS LE)比较

    前言 经常有朋友会问我,“我这个方案是用A家的FPGA还是X家的FPGA呢?他们的容量够不够呢?他们的容量怎么比较呢?”当然,在大部分时候,我在给客户做设计的时候,直接会用到最高容量的产品,因为我们的 ...

  7. git之合并分支(git merge)------(三)

    最近几天写小demo,总是自己拉取他人的代码,然后创建分支,在自己的分支上进行修改,然后提交到自己的分支,具体的这一步,我就不多讲了,因为在我的博客“工作中常用的Git操作”中有详细的介绍,今天主要讲 ...

  8. datatable表格框架服务器端分页查询设置

    更多内容推荐微信公众号,欢迎关注: js代码如下: $('#mytable').dataTable( { "bServerSide": true, //开启服务器模式,使用服务器端 ...

  9. [转]Git忽略提交规则 - .gitignore配置运维总结

    在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交.简单来说一个场景:在你使用git add .的时候,遇到 ...

  10. v4l2API无法执行VIDIOC_DQBUF的问题

    一.PC虚拟机下ubuntu14.04.1环境下 源文件:show.c  USB摄像头格式yuyv: 申请缓冲帧数2,分辨率640*480  阻塞无法执行 申请缓冲帧数4,分辨率640*480  阻塞 ...