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

class People
    def __init__(self,name,weight,height)
         self.name=name
         self.weight=weight
         self.height=height

     @property      #为bmi这个函数添加装饰器,将其伪装成一个数据属性
     def bmi(self):
          return self.weight/(self.height*height)

egon=People('egon',75,1.80)
print(egon.bmi)       #23.148148148148145

为什么要用property
将一个类的函数定义成特性以后,调用egon.bmi本质就是触发函数bmi的执行,从而拿到其的返回值

多态
多态指的是一类事物有多种形态
动物有多种形态:人,狗,猪

class Animal:
     def eat(self):
          pass

     def drink(self):
          pass

     def run(self):
          pass

     def bark(self):
          pass

class Cat(Animal):
def bark(self):
print('喵喵喵')

class Dog(Animal):
def bark(self):
print('汪汪汪')

class Pig(Animal):
def bark(self):
print('哼哼哼')
c=Cat() 
d
=Dog()
p
=Pig()
多态性:可以在不用考虑对象具体类型的前提下而直接使用对象下的方法
c.bark() #
喵喵喵
d.bark() #汪汪汪
p.bark() #哼哼哼

 

强制子类遵循父类的标准:导入ABC,用上装饰器@abc  #abstract class      #抽象类

import abc  
class Animal(metaclass=abc.ABCMeta): #代表把Animal的属性改了,让它变成了抽象基类
@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 jiao(self):
print('喵喵喵')

class Dog(Animal):
def speak(self):
print('汪汪汪')

class Pig(Animal):
def han(self):
print('哼哼哼')
c=Cat     #报错     #不能用抽象方法实例化抽象类猫:吠、喝、吃、跑

以下:
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('汪汪汪')

class Pig(Animal):
def eat(self):
print('pig eat')

def drink(self):
print('pig drink')

def run(self):
print('pig run')

def bark(self):
print('哼哼哼')

c=Cat()
d=Dog()
p=Pig()


c.bark() #汪汪汪
d.bark() #喵喵喵
p.bark() #哼哼哼

 

classmethod与staticmethod
1.绑定方法:
 在类内部定义的函数,默认就是给对象来用的,而且是绑定给对象用的,称为绑定方法
绑定对象的方法特殊之处:应该由对象来调用,对象来调用,会自动将对象当作第一个参数传入
绑定到类的方法特殊之处:应该由类来调用,类来调用,会自动将类当作第一个参数传入

import srttings         #导入配置文件

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):
          return cle(settings.NAME,settings.AGE)

p1=people('alex',18)
p1.tell()        #alex:18

p2=People.from_conf()
p2.tell()        #从配置文件取出数据   #gao:18


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'%(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'))
          return m.hexdigest()

obj=People('egon',18)           
print(obj.uid,obj.name,obj.age)      #30fcf512a7097504c212f4eda4bab29a egon 18
obj.tell()           #30fcf512a7097504c212f4eda4bab29a: egon:18

print(obj.create_id()) #5138e199a8e3708957dac3f19942f5e7
print(People.create_id()) #2db27a6a674703445c453b849cb1758c

 

posted on 2018-04-16 17:24  muzinianhua  阅读(127)  评论(0编辑  收藏  举报