一 特性( property)

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值。

property是内置的一种封装方法:把一个属性“伪装”成一个数据属性,做法就是在需要伪装的属性正上方加@property。

那么其实我们并不是说每个属性都需要伪装,比如说我们的身体bmi指数,是通过计算得来的,所以我们一般会定义一个函数,因为他需要计算,但是其实他更像

一个类似名字,性别这一类的属性,所以这个时候我们就可以使用@property。

  1. class Poeple:
  2. def __init__(self,name,weight,height):
  3. self.name=name
  4. self.weight=weight
  5. self.height=height
  6. @property
  7. def bmi(self):
  8. return self.weight/(self.height**2)
  9.  
  10. egon=Poeple('egon',80,1.80)
  11. # print(egon.bmi())
  12. print(egon.bmi)#在属性正上方加@property
  13. class Poeple:
  14. def __init__(self,name):
  15. self.__name=name
  16. @property
  17. def name(self):###访问——name的值
  18. print('你现在访问用户名')
  19. return self.__name
  20. @name.setter#####改变——name的值
  21. def name(self,n):#####修改名字
  22. print('修改名字为n')
  23. self.__name=n
  24.  
  25. @name.deleter###删除名字——name
  26. def name(self):
  27. del self.__name
  28.  
  29. obj=Poeple('egon')
  30. print(obj.name)####查看名字
  31. obj.name='sb'
  32. print(obj.name)###把——name改为sb
  33. del obj.name
  34. print(obj.name)#删除之后找不到——name
  35. 有一点需要注意的是,改的是隐藏过得——name,在内部隐藏所以内部可以直接调用。

二  多态性

多态就是:同一事物的多种形态,比如我们的动物类有:猫,狗,等。我们的水:液态的水,气态的水,固态的水。

使用原则:可以在不用考虑对象的具体类型的前提下直接使用对象的方法。也就是说所有的对象都可以直接使用基类中定义的属性。

  1. import abc
  2. class Animal(mateclass=abc.ABCMeta):
  3. @abc.abstractmethod
  4. def eat(self):
  5. pass
  6. @abc.abstractmethod
  7. def sleep(self):
  8. pass
  9. @abc.abstractmethod
  10. def run(self):
  11. pass
  12. @abc.abstractmethod
  13. def bark(self):
  14. pass
  15.  
  16. class Cat(Animal):
  17. def sleep(self):
  18. print('sleep')
  19. print('cat')
  20. class Dog(Animal):
  21. print('dog')
  22.  
  23. c=Cat()#c为一种动物
  24. # c.bark()
  25. c.sleep()
  26. # c.eat()
  27. c.run()
  28.  
  29. d=Dog()
    那么对于c这个对象,他可以使用基类中的所有属性。也可以在继承的基础上派生自己的功能。也就是说所有的子类实例化产生的相都可以直接调用基类中的函数(属性),
    同时又可以有自己的属性。
    在我们调用import abc:时我们可以再基类的属性正上方加上@abc.abstractmethod,那么子类再调用的时候就不能扩展自己的功能,也就是不能派生。
    只能调用基类中已有的,否则就会报错。
    还有一点就是:抽象后的基类不能在进行实例化。
    那么这种抽象化的方式耦合度是非常高的,我们可以通过鸭子类型来进行解耦合。
  1. 那么这种抽象化的方式耦合度是非常高的,我们可以通过鸭子类型来进行解耦合。
    我们说:如果一个东西他叫起来像鸭子,走路像鸭子,游泳像鸭子我们就把它叫鸭子。
  1. 二者都像鸭子,二者看起来都像文件,因而就可以当文件一样去用,这种方式是一种解耦合。
  2. class TxtFile:
  3. def read(self):
  4. pass
  5.  
  6. def write(self):
  7. pass
  8.  
  9. class DiskFile:
  10. def read(self):
  11. pass
  12. def write(self):
  13. pass

那么其实我们之前也学了多态:

  1. #str,list,tuple都是序列类型
  2. s=str('hello')
  3. l=list([1,2,3])
  4. t=tuple((4,5,6))
  5.  
  6. #我们可以在不考虑三者类型的前提下使用s,l,t
  7. s.__len__()
  8. l.__len__()
  9. t.__len__()
  10.  
  11. len(s)
  12. len(l)
  13. len(t

三 classmethod与staticmethod

我们之前说过绑定方法:

  1. 1. 绑定到类的方法:用classmethod装饰器装饰的方法。
  2. 为类量身定制
  3.  
  4. 类.boud_method(),自动将类当作第一个参数传入
  5.  
  6. (其实对象也可调用,但仍将类当作第一个参数传入)
  7.  
  8.     2. 绑定到对象的方法:没有被任何装饰器装饰的方法。
  9.  
  10. 为对象量身定制
  11.  
  12. 对象.boud_method(),自动将对象当作第一个参数传入
  13.  
  14. (属于类的函数,类可以调用,但是必须按照函数的规则来,没有自动传值那么一说)
  1. HOST='127.0.0.1'
  2. PORT=3306
  3. DB_PATH=r'C:\Users\mackle\PycharmProjects\day02\第五周.py'
  1. import setting
  2. class MySQL:
  3. def __init__(self,host,port):
  4. self.host=host
  5. self.port=port
  6.  
  7. @classmethod
  8. def from_conf(cls):#我们一旦绑定到类,那么再定义函数后面就会自动出现(cls),我们调用这个方法就是把类作为第一个参数传入。
  9. print(cls)
  10. return cls(setting.HOST,setting.PORT)
  11.  
  12. print(MySQL.from_conf) #<bound method MySQL.from_conf of <class '__main__.MySQL'>>
  13. conn=MySQL.from_conf()###<class '__main__.MySQL'>
  1. conn.from_conf() #<class '__main__.MySQL'>对象也可以调用,但是默认传的第一个参数仍然是类

非绑定方法:

  1. 非绑定方法:用staticmethod装饰器装饰的方法
  2.  
  3.    1. 不与类或对象绑定,类和对象都可以调用,但是没有自动传值那么一说。这个时候他就是一个普通函数而已。
  4.  
  5.     注意:与绑定到对象方法区分开,在类中直接定义的函数,没有被任何装饰器装饰的,都是绑定到对象的方法,可不是普通函数,
    对象调用该方法会自动传值,而staticmethod装饰的方法,不管谁来调用,都没有自动传值一说:
  1. @staticmethod#####不绑定,将函数变成普通函数,没有自动传值的特性了
  2. def creat_id():
  3. m=hashlib.md5()
  4. m.update(str(time.clock).encode('utf-8'))
  5. return m.hexdigest()

面向对象之—property,staticmethod的更多相关文章

  1. python之内置装饰器(property/staticmethod/classmethod)

    python内置了property.staticmethod.classmethod三个装饰器,有时候我们也会用到,这里简单说明下 1.property 作用:顾名思义把函数装饰成属性 一般我们调用类 ...

  2. 面向对象 - 封装/property - 总结

    面向对象 - 封装: 封装:在类定义阶段,以__开头的属性名发生了变形 eg: __x --> _A__x / __foo --> _A__foo 1.特点: 1.在类外部无法直接访问 _ ...

  3. 通过代码学习python之@property,@staticmethod,@classmethod

    URL: https://www.the5fire.com/python-property-staticmethod-classmethod.html #coding=utf-8 class MyCl ...

  4. Python面向对象 -- slots, @property、多重继承MixIn、定制类(str, iter, getitem, getattr, call, callable函数,可调用对象)、元类(type, metaclass)

    面向对象设计中最基础的3个概念:数据封装.继承和多态 动态给class增加功能 正常情况下,当定义了一个class,然后创建了一个class的实例后,可以在程序运行的过程中给该实例绑定任何属性和方法, ...

  5. 面向对象之property

    property功能 以调用数据属性的方式(不用加括号)调用方法 方法定义成数据属性(方法本应该是动词) # 定义property之前 class People: def __init__(self, ...

  6. python 面向对象七 property() 函数和@property 装饰符

    一.property引入 为了使对象的属性不暴露给调用者和进行属性值检查,设置了访问属性的接口函数,使用函数访问属性,并可以在函数内部检查属性. >>> class Student( ...

  7. Python - 面向对象编程 - @property

    前言 前面讲到实例属性的时候,我们可以通过 实例对象.实例属性 来访问对应的实例属性 但这种做法是不建议的,因为它破坏了类的封装原则 正常情况下,实例属性应该是隐藏的,只允许通过类提供的方法来间接实现 ...

  8. day 23 面向对象中类的成员 和嵌套

    1.类的成员? 变量.方法.属性 class Foo: # 方法 def __init__(self,name): # 实例变量/字段 self.name = name # 方法 def func(s ...

  9. python中面向对象之装饰器

    python面向对象内置装饰器property,staticmethod,classmethod的使用 @property 装饰器作用及使用 作用:面向对象中的方法伪装成属性 使用如下: class ...

随机推荐

  1. CSS vertical-algin的使用

    一.什么vertical-algin vertical的意思就是垂直,algin是对齐的意思,连起来就是“垂直对齐方式”,接下来看看vertical-algin有哪些属性,打开浏览器一看 vertic ...

  2. hadoop 常见 命令

    一  hadoop namenode 命令 1 格式化namanode 磁盘  hadoop namenode -format 二  hadoop fs 命令     和 linux  命令 非常类似 ...

  3. MySQL通过Navicat实现远程连接

    直接使用Navicat通过IP连接会报各种错误,例如:Error 1130: Host '192.168.1.80' is not allowed to connect to this MySQL s ...

  4. py-day1-3 python基本数据类型

    数据的基本类型: 数字:

  5. Redis 键命令

    1.设置key值 set name zhangsan 删除key del name 2. 判断key是否存在 exists a,返回1 说明存在:  0 表示不存在 3. 剩余过期时间 ttl 返回- ...

  6. redis sentinel哨兵的使用

    哨兵模式是Redis集群管理的一种方式. 下面以Go语言为例介绍其使用方式. 使用举例 package main import ( "fmt" "strings" ...

  7. 开源自然语言处理工具包hanlp中CRF分词实现详解

     CRF简介 CRF是序列标注场景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗标记偏置的问题. [gerative-discriminative.png] CRF训练 这类耗时的任务,还 ...

  8. Elasticsearch的数据导出和导入操作(elasticdump工具),以及删除指定type的数据(delete-by-query插件)

    Elasticseach目前作为查询搜索平台,的确非常实用方便.我们今天在这里要讨论的是如何做数据备份和type删除.我的ES的版本是2.4.1. ES的备份,可不像MySQL的mysqldump这么 ...

  9. ueditor图片上传和显示问题

    图片上传: 这段是contorller代码 @RequestMapping(value = "/uploadImg", method = RequestMethod.POST) @ ...

  10. js控制html5 【video】标签中视频的播放和停止

    需求:页面中有2个普通按钮a,b.还有一个video标签,能成功播放出视频..我想要的效果是,点击a按钮,视频开始播放,点击b按钮,视频播放停止!!!<br><br>----- ...