16 Apr 18 封装的property 多态 鸭子类型 classmethod和staticmethod

16 Apr 18

一、      封装的property

BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)

成人的BMI数值:

过轻:低于18.5

正常:18.5-23.9

过重:24-27

肥胖:28-32

非常肥胖, 高于32

体质指数(BMI)=体重(kg)÷身高^2(m)

首先需要明确。bmi是算出来的,不是一个固定死的值,也就说我们必须编写一个功能,每次调用该功能都会立即计算一个值,但很明显人的bmi值听起来更像一个名词而非动词,于是我们需要为bmi这个函数添加装饰器将其伪装成一个数据属性

class People:

def __init__(self,name,weight,height):

self.name=name

self.weight=weight

self.height=height

@property

def bmi(self):

return self.weight / (self.height * self.height)

egon=People(‘egon‘,75,1.80)

print(egon.bmi) #23.148148148148145

egon.weight=70    #可以为weight改值,bmi随˙之变化

print(egon.bmi) #21.604938271604937,调用egon.bmi本质就是触发函数bmi的执行,从而拿到其返回值

egon.bmi=123 # 报错,egon.bmi背后对应的是一个函数,所以不能赋值

# 了解

class People:

def __init__(self,name):

self.__name=name

@property

def name(self): #obj.name

print(‘您现在访问的是用户名。。。‘)

return self.__name

@name.setter #obj.name=‘EGON‘ # @property装饰的函数可以掉setter及deleter

def name(self,x):

if type(x) is not str:

raise TypeError(‘名字必须是str类型‘)

self.__name=x

@name.deleter

def name(self):

# print(‘就不让你删‘)

del self.__name

obj=People(‘egon‘)

print(obj.name)   #查

obj.name=‘EGON‘   #改

print(obj.name)

obj.name=123    #限制改

del obj.name    #删

obj.name

#property, classmethod和staticmethod为面向对象中的三大函数

#用装饰器property将数据属性藏起来,进行查改删操作,用户无感

二、      多态

什么是多态:多态指的是同一种事物多种形态

为什要用多态:用基类创建一套统一的规则,强制子类去遵循(使用抽象类实现),这样便可以在不用考虑对象具体类型的前提下而直接使用对象下的方法。多态在程序中表现可以是继承,但单纯意义伤的继承无法让父类严格限制子类。

多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法

如何用多态

import abc #abstract class

class Animal(metaclass=abc.ABCMeta):

@abc.abstractmethod

def eat(self):

pass

@abc.abstractmethod

def drink(self):

pass

@abc.abstractmethod

def run(self):

pass

@abc.abstractmethod

def bark(self):

pass

class Cat(Animal):

def eat(self):

print(‘cat eat‘)

def drink(self):

print(‘cat drink‘)

def run(self):

print(‘cat run‘)

def bark(self):

print(‘喵喵喵‘)

class Dog(Animal):

def eat(self):

print(‘dog eat‘)

def drink(self):

print(‘dog drink‘)

def run(self):

print(‘dog run‘)

def bark(self):

print(‘汪汪汪‘)

obj=Animal() # 报错,抽象基类本身不能被实例化

c=Cat()   #当子类的定义形式不符合要求是,定义阶段不报错,在调用该类定义对象时才报错

d=Dog()

c.bark()

d.bark()

or

c=Cat()

d=Dog()

def BARK(animal):

animal.bark()

BARK(c)

BARK(d)

多态概念在python中纵观始终的被使用,也提现了python一切皆对象的理念

s=‘hello‘

l=[1,2,3]

t=(4,5,6)

s.__len__()

l.__len__()

t.__len__()

def LEN(obj):

return obj.__len__()

print(LEN(s))

print(LEN(l))

print(LEN(t))

or

print(len(l))

print(len(s))

print(len(t))

三、      鸭子类型

class Foo:

def f1(self):

print(‘from foo.f1‘)

def f2(self):

print(‘from foo.f2‘)

class Bar:

def f1(self):

print(‘from bar.f1‘)

def f2(self):

print(‘from bar.f2‘)

obj1=Foo()

obj2=Bar()

obj1.f1()

obj1.f2()

obj2.f1()

obj2.f2()

#在python中,长得像鸭子,叫起来像鸭子,就是一只鸭子

#linux中一切皆文件,皆可读写

class Disk:

def read(self):

print(‘disk read‘)

def write(self):

print(‘disk write‘)

class Txt:

def read(self):

print(‘txt read‘)

def write(self):

print(‘txt write‘)

class Process:

def read(self):

print(‘process read‘)

def write(self):

print(‘process write‘)

obj1=Disk()

obj2=Txt()

obj3=Process()

obj1.read()

obj2.read()

obj3.read()

四、      classmethod和staticmethod

1 绑定方法:

在类内部定义的函数,默认就是给对象来用,而且是绑定给对象用的,称为对象的绑定方法。  #什么装饰器都不加

绑定对象的方法特殊之处:应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入。

绑定到类的方法特殊之处:应该由类来调用,类来调用,会自动将类当作第一个参数传入。  #加classmethod装饰器

总的来说,类中的函数可和对象绑定,可和类绑定(classmethod),也可随都不绑定(statismethod)

import settings

class People:

def __init__(self,name,age):

self.name=name

self.age=age

def tell(self):

print(‘%s:%s‘ %(self.name,self.age))

@classmethod

def from_conf(cls):   #加classmethod装饰器时,pycharm自动加参数cls,为类的绑定方法

return cls(settings.NAME,settings.AGE)

p=People(‘egon‘,19)

p.tell()

p4=People.from_conf()  #类调用不用传第一个参数,自动传参

p4.tell()

2、staticmethod:非绑定方法,就是一个普通函数

特性:既不跟类绑定,也不跟对象绑定,这意味着谁都能用;谁来用都是一个普通函数,也就是说没有自动传值的特性了

import settings

import hashlib

import time

class People:

def __init__(self,name,age):

self.uid=self.create_id()

self.name=name

self.age=age

def tell(self):

print(‘%s: %s:%s‘ %(self.uid,self.name,self.age))

@classmethod

def from_conf(cls):

return cls(settings.NAME,settings.AGE)

@staticmethod

def create_id():

m=hashlib.md5()

m.update(str(time.clock()).encode(‘utf-8‘))  #time.clock()与cpu有关,每次值都不同

return m.hexdigest()

obj=People(‘egon‘,18)

obj.tell() #print(obj.uid,obj.name,obj.age)

print(obj.create_id())     #对象可调用

print(People.create_id())  #类可调用

原文地址:https://www.cnblogs.com/zhangyaqian/p/py20180416.html

时间: 2024-10-09 11:13:43

16 Apr 18 封装的property 多态 鸭子类型 classmethod和staticmethod的相关文章

面向对象之组合、封装、多态性、鸭子类型

一.组合 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 # class Foo: # aaa=1111 # def __init__(self,x,y): # self.x=x # self.y=y # # def func1(self): # print('Foo内的功能') # # # class Bar: # bbb=2222 # def __init__(self, m, n): # sel

组合||抽象类||多态||鸭子类型

组合 软件重用的重要方式除了继承之外还有另外一种方式,即:组合 组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合 class People: def __init__(self,name,age,sex): self.name = name self.age = age self.sex = sex class Renwen(People): def __init__(self,name,age,sex,weapon): super().__init__(name,age,se

4月16日 python学习总结 封装之property、多态 、classmethod和staticmethod

一.封装之property @property把一个函数伪装成一个数据类型  @伪装成数据的函数名.setter   控制该数据的修改,修改该数据时触发 @伪装成数据的函数名.delect  控制该数据的删除,删除该数据时触发 class People: def __init__(self,name): self.__name=name @property #将name()函数伪装成一个数据属性name def name(self): #obj.name print('您现在访问的是用户名...

封装之property,多态,鸭子类型,classmethod与staticmethod

一.封装之Property prooerty是一种特殊的属性,访问时他会执行一段功能(函数)然后返回 '''BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解) 成人的BMI数值:过轻:低于18.5正常:18.5-23.9过重:24-27肥胖:28-32非常肥胖, 高于32 体质指数(BMI)=体重(kg)÷身高^2(m) EX:70kg÷(1.75×1.75)=22.86 ''' class People: def __init__(se

Python基础- 类和对象(使用、继承、派生、组合、接口、多态、封装、property、staticmethod、classmethod、反射、slots、上下文管理协议、元类)

标签: python对象 2017-07-01 16:28 79人阅读 评论(0) 收藏 举报  分类: python(11)  版权声明:本文为广大朋友交流学习,如有纰漏望不吝赐教,若存在版权侵犯请及时与我联系 目录(?)[+] 一.初识类和对象 在python3中类型就是类 先定义类在产生相对应的对象,也就是现有了概念再有了实体 class Garen: camp = 'Demacia' def attack(self): print('attack') 1.如何使用类 在python3:

python面向对象:组合、封装、property装饰器、多态

一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 ''' # class Foo: # aaa=1111 # def __init__(self,x,y): # self.x=x # self.y=y # # def func1(self): # print('Foo内的功能') # # # class Bar: # bbb=2222

023_接口类,抽象类,多态,鸭子类型,封装

1,接口类 1 class Wechat(): 2 def pay(self,money): 3 print('已经用微信支付了%s元'%money) 4 class Alipay(): 5 def pay(self,money): 6 print('已经用支付宝支付了%s元' % money) 7 wechat = Wechat() 8 ali = Alipay() 9 # wechat.pay(100) 10 # ali.pay(200) 11 #将上面两句用下面的替换, 12 def pa

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: ? ? ? ? ? ?将一些东西封装到一个地方,你还可以取出来 ? ? ? ? ? ?类设置静态属性, 设置一些方法 或者 对象, 对象可以在其对象封装一些属性 多态: ? ? ? ? ? ?python默认支持多态, 多态指的是一种事务具有多种形态 ? ? ? ? ? ?1.多态可以增加代码的灵活度: ? ? ? ? ? ?2.以继承和重写父类方法为前提: ?

封装- --接口,抽象, 鸭子类型 #22

知识点1.封装 1.封装.py 1 '''''' 2 """ 3 封装: 4 """ 5 6 """ 7 1.什么是封装? 8 就是将复杂的丑陋的,隐私的细节,隐藏到内部,对外提供简单的使用接口 9 10 即:对外隐藏内部实现细节,并提供访问接口 11 """ 12 """ 13 2.为什么需要封装? 14 两个目的: 15 1.为了保证 关键数据的安全性