封装

复习:

1.接口类,python 中无接口类,有抽象类,通过abc模块中的metaclass=ABCMeta,abstractmeta

2.接口类和抽象类本质是代码规范用的,

3.接口类,抽象类的区别:再java的角度看,是有区别的,java没有多继承,所以为了接口隔离原则,设计了接口这个概念,

      java本来就支持单继承,所以就有了抽象类,所以对接口类和抽象类区别不太明显,而python中既支持单继承也支持多继承,甚至在python中没有内置接口。

4.多态和鸭子类型

多态-------python天生支持多态

鸭子类型-----不依赖父类的情况下实现两个相似的类中的同名方法。

5.封装-------私有的

python中只要有__名字,就把这个名字私有化了,私有化后就不能直接从外部直接调用,这种私有化只是从代码级别做了变形,并没有真的约束

变形机制_类名__名字 ,在类外用这个调用,在类的内部可直接调用__名字。

6.静态属性,方法,对象属性,都可以私有化。

property 内置装饰器函数,只在面向对象中用
  1.可以把方法伪装成属性(方法后面就不以传任何参数了)
from math import pi
class Circle:
    def __init__(self,r):
        self.r = r
    @property-------------伪装方法为属性
    def perimeter(self):-----------不可传任何参数
        return 2*pi*self.r
    @property
    def area(self):
        return pi*self.r**2
circle = Circle(2)
print(circle.perimeter)------------去了括号
print(circle.area)
View Code
class Person:
    def __init__(self,name):
        self.__name = name
        self.price = 20
    @property -------------伪装
    def name(self):
        return self.__name
    @name.deleter---------------删除
    def name(self):
        del self.__name
    @name.setter----------修改名字
    def name(self,new_name):------------有且只能有一个参数
        self.__name = new_name
b = Person('we')
# del b.price
# print(b.price)
print(b.name)
b.name = 're'
print(b.name)
View Code

classmethod 内置装饰器

@classmethod,把一个方法变成一个类方法,就可以直接用类名调用。这个方法用于操作静态属性时候。

@staticmethod

在完全面向对象的程序中,如果一个函数既和对象没关系也和类美关系,那么就用staticmethod

类调用类方法和静态方法,

对象可以调用类方法和静态方法嘛?可以

类方法有一个默认参数 cls 代表这个类

静态方法没有默认参数,就像函数一样.

 

反射
通过反射:对象名 获取对象属性和普通方法,类名获取静态属性和类方法和静态方法
普通方法 self
静态方法 @staticmethod

 

posted @ 2018-01-19 16:03  liang哥哥  阅读(57)  评论(0)    收藏  举报