接口类

接口类:是规范子类的一个模板,只要接口类中定义的,就应该在子类中实现
接口类不能被实例化,它只能被继承
支持多继承
接口隔离原则:使用多个专门的接口,而不使用单一的总接口。即客户端不应该依赖那些不需要的接口

from abc import ABCMeta,abstractmethod
class Payment(metaclass=ABCMeta): # 元类 模板,接口类
@abstractmethod # 装饰接口类中方法的,加上了这个装饰器,自动检测子类中的方法名
def pay(self,money):pass class Apple_Pay(Payment):
def pay(self,money):
print('您使用苹果支付了%s元'%money) class Ali_Pay(Payment):
def pay(self,money):
print('您使用支付宝支付了%s元'%money) class WeChat_Pay(Payment):
def pay(self,money):
print('您使用微信支付了%s元'%money) def pay(obj,money):
return obj.pay(money) apple = Apple_Pay()
ali = Ali_Pay()
wechat = WeChat_Pay()

抽象类

模板 规范
抽象类可以实现一些子类共有的功能和属性
抽象类不鼓励多继承
文件操作:打开文件 关闭文件 写文件 读文件
硬盘操作: 打开 关闭 写 读
进程文件: 打开 关闭 写 读
python没有接口的概念
只能借助抽象类的模块来实现接口类
接口 —— java:没有多继承 —— Interface

抽象类不能被实例化
这个抽象类可以规范子类必须实现抽象类中的抽象方法

from abc import ABCMeta,abstractmethod
class Base(metaclass=ABCMeta):
def __init__(self,filename):
self.filename = filename
@abstractmethod # 抽象方法
def open(self):
return 'file_handler'
@abstractmethod
def close(self):pass
@abstractmethod
def read(self):pass
@abstractmethod
def write(self):pass class File(Base):
def open(self):pass
def close(self):pass
def read(self):pass
def write(self):pass

封装

class Dog:
__role = 'dog' # 私有静态属性
# def func(self):
# print(Dog.__role)
def __func(self):
print('in__func')
# print(Dog.__role) # 报错
print(Dog.__dict__) # '_Dog__role': 'dog'
print(Dog._Dog__role) # dog 从类的外面不能直接调用,在类外的使用加上了一层密码:_类名 d = Dog()
# d.func() # dog
d._Dog__func() # in__func

定义一个私有变量\属性\方法: __名字
在类的内部直接使用: __名字
在类的外部不能直接使用,如果一定要用,在私有方法之前加上: __类名,变成 _类名__名字
在类外的名字 通过__dict__查看

class Room:
def __init__(self,name,price,length,width):
self.name = name
self.price = price
self.__length = length # 私有的对象属性
self.__width = width def area(self):
return self.__length*self.__width house = Room('房子',1000000,2,1)
print(house.area())

私有的
私有的静态属性、方法、对象属性
使用__名的方式调用,保证在类内部可以调用,外部不行
私有的 不能被继承
当有一个名字,不想被外部使用也不想被子类继承,只想在内部使用的时候就定义私有的

class Person:
def __init__(self,name,height,weight):
self.name = name
self.height = height
self.weight = weight
@property
def bmi(self):
return self.weight / (self.height**2)
li = Person('李岩',1.75,85)
print(li.bmi)

@property 把一个方法伪装成一个属性
1.属性的值 是这个方法的返回值
2.这个方法不能有参数了

from math import pi
class Circle:
def __init__(self,r):
self.radius = r
@property
def perimeter(self):
return 2*pi*self.radius
@property
def area(self):
return pi*self.radius**2
c1 = Circle(5)
print(c1.perimeter)
print(c1.area) class Goods:
__discount = 0.8 # 静态属性
def __init__(self,name,price):
self.name = name
self.__price = price # 原价
@property
def price(self): # 折后价
return self.__price*Goods.__discount
@price.setter
def price(self,new_price): # 修改原价
if type(new_price) is int:
self.__price = new_price apple = Goods('苹果',10)
apple.kind = '富士'
apple.price = 6
print(apple.price)

封装
__私有+property
让对象的属性变得更安全了
获取到的对象的值可以进行一些加工
修改对象的值的同时可以进行一些验证

伪装后属性的修改和删除

class Foo:
@property
def AAA(self):
print('get的时候运行我啊') @AAA.setter
def AAA(self,value):
print('set的时候运行我啊') @AAA.deleter
def AAA(self):
print('delete的时候运行我啊') # 只有在属性AAA定义property后才能定义AAA.setter,AAA.deleter
f1 = Foo()
f1.AAA
f1.AAA = 'aaa'
del f1.AAA

classmethod和staticmethod

类方法
调用:不需要实例化 直接用类名调用就好
定义:不用接收self参数,默认传cls,cls就代表当前方法所在的类
什么时候用类方法
需要使用静态变量且不需要和对象相关的任何操作的时候

class Goods:
__discount = 0.8
@classmethod # 类方法
def change_discount(cls,new_discount):
cls.__discount = new_discount
@classmethod
def get_discount(cls):
return cls.__discount
Goods.change_discount(0.75)
print(Goods.get_discount())

静态方法
如果这个方法既不需要操作静态变量也不需要使用对象相关的操作,就使用静态方法

class A:
@staticmethod
def func():
print(123)

面向对象编程: 专门为面向对象编程提供的一个方法——staticmethod
它完全可以当作普通的函数去用,只不过这个函数要通过类名.函数名()调用
其他 传参 返回值 完全没有区别

类里面:一共可以定义三种方法
普通方法 self
类方法 cls
静态方法

绑定方法和非绑定方法

class A:
@staticmethod
def func1():
print(123)
@classmethod
def func2(cls):
print(123)
def func3(self):pass
a = A()
print(a.func1) # 静态方法 <function A.func1 at 0x000000000236AA60>
print(a.func2) # 类方法 <bound method A.func2 of <class '__main__.A'>> 绑定到A类的func
print(a.func3) # 普通方法 <bound method A.func3 of <__main__.A object at 0x000000000236B668>> 绑定到A类对象的func

静态方法和类方法 都是直接可以使用类名调用
普通方法:对象调用

面向对象封装 classmethod和staticmethod方法的更多相关文章

  1. 面向对象之-@classmethod、@staticmethod和@classonlymethod的区别

    实例方法.静态方法与类方法的含义 实例方法(普通方法)的含义就是需要类对象实例之后才能调用的方法,该方法的基本格式为: def test(self,*args,**kwargs): # 第一个参数必须 ...

  2. 面向对象:classmethod、staticmethod、property

    一.classmethod(类方法).staticmethod(静态方法) 方法包括:普通方法.类方法和静态方法,三种方法在内存中都归属于类,区别在于调用方式不同. # 普通方法 由对象调用,至少一个 ...

  3. @classmethod及@staticmethod方法浅析【python】

    目前对于python中@classmethod 类方法和@staticmethod静态方法的有了一定的认识,之后有进一步的认识后继续记录. @classmethod :是和一个class类相关的方法, ...

  4. 面向对象之classmethod和staticmethod(python内置装饰器)

    对象的绑定方法复习classmethodstaticmethod TOC 对象的绑定方法复习 由对象来调用 会将对象当做第一个参数传入 若对象的绑定方法中还有其他参数,会一并传入 classmetho ...

  5. 初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)

    封装 # class Room:# def __init__(self,name,length,width):# self.__name = name# self.__length = length# ...

  6. python 封装,隐藏属性,绑定方法classmethod和staticmethod

    [封装] 隐藏对象的属性和实现细节,仅对外提供公共访问方式. [好处] 1. 将变化隔离: 2. 便于使用: 3. 提高复用性: 4. 提高安全性: [封装原则] 1. 将不需要对外提供的内容都隐藏起 ...

  7. python基础语法17 面向对象4 多态,抽象类,鸭子类型,绑定方法classmethod与staticmethod,isinstance与issubclass,反射

    多态 1.什么是多态? 多态指的是同一种类型的事物,不同的形态. 2.多态的目的: “多态” 也称之为 “多态性”,目的是为了 在不知道对象具体类型的情况下,统一对象调用方法的规范(比如:名字). 多 ...

  8. 面向对象(四)——classmethod、staticmethod装饰器(绑定方法与非绑定方法)

    classmethod.staticmethod装饰器 一.绑定方法与非绑定方法 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): (1) 绑定到类的方法:用classmethod ...

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

    一.封装之property @property把一个函数伪装成一个数据类型  @伪装成数据的函数名.setter   控制该数据的修改,修改该数据时触发 @伪装成数据的函数名.delect  控制该数 ...

随机推荐

  1. nginx配置事例

    #user nobody; worker_processes 4; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...

  2. ubox及日志管理

    ubox是openwrt的帮助工具箱,位于代码package/system/ubox下, CMakeLists.txt kmodloader.c log/ lsbloader.c validate/ ...

  3. ORA-01036: 非法的变量名/编号

    今天写程序时,往Oracle中插入二进制数据,出现错误ORA-01036:非法的变量名/编号,代码如下: strSql = "INSERT INTO KA99 (KA991,KA992,KA ...

  4. Hive学习笔记——保存select结果,Join,多重插入

    1. 保存select查询结果的几种方式: 1.将查询结果保存到一张新的hive表中 create table t_tmp as select * from t_p; 2.将查询结果保存到一张已经存在 ...

  5. impala+kudu

    [impala建表]kudu的表必须有主键,作为分区的字段需排在其他字段前面. [range分区](不推荐)CREATE TABLE KUDU_WATER_HISTORY ( id STRING, y ...

  6. The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha

    The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Cha ...

  7. Sql server不同数据类型间拼接(+)

    )+'m' 输出 4m 若 +'m' 输出:在将 varchar 值 'm' 转换成数据类型 int 时失败.  

  8. CSS中的绝对定位(absolute)误区

    这几天在慕课上看视频学习,偶然听到几个老师都说:CSS绝对定位在没有其他有除static定位的包含块的情况下是以body进行定位,如果要想相对当前元素的父元素来定位,父元素一定要设置position: ...

  9. (转)使用.NET Reflector 查看Unity引擎里面的DLL文件

    当你查看unity里面API的时候,是不是有时候追踪了一两步就碰到DLL文件走不下去了呢?很是不爽吧. 这种问题我也是经常碰到.这是人家商业引擎不想让你看到底层代码啦,所以着急不得. 不过,今天我终于 ...

  10. awk向脚本传递參数(二)

    命令行參数的一个重要限制是它们在BEGIN过程中是不可用的. 也就是说,直到首行输入完毕以后它们才可用.为什么?这是一个easy混乱的部分.从命令行传递的參数就好像文件名称一样被处理.赋值操作知道这个 ...