博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
封装和内置函数property classmethod staticmethod
阅读量:6432 次
发布时间:2019-06-23

本文共 3931 字,大约阅读时间需要 13 分钟。

一.封装

1.封装的概念:

广义上的封装 : 属于一个类的静态和动态属性 总是出现在一个类中               #使用永远在类的内部用类名或者对象名调用 狭义上的封装 : 就是把变量\方法私有化,在类的外部以及子类中不能直接使用了

2.私有变量:

在python中用双下划线开头的方式将属性隐藏起来 在内部中调用会自动变形:__x都会自动变形成:_类名__x的形式

2.1静态变量私有化

class A:     start="aaa"   # 静态变量     __s="bbb"      # 私有的静态变量     def wahaha(self):         print(A.__s)  #A._A__s
1.在外部是无法通过__x这个名字找到变量 print(A.__s)  AttributeError print(A._A__s) #bbb 在类的外面调用私有的变量 但不使用此方法 2.不能在外部创建一个私有的变量 A.__B="ccc" print(A.__dict__) #在A中并没有_A_B:CCC

2.2属性私有化

class B:     def __init__(self,name,pwd):         self.name = name         self.__pwd = pwd   # 也可以创建对象的私有属性     def get_pwd(self):         print(self.__pwd) b = B('alex','alex3714') print(b.name)  #alex print(b.__pwd) AttributeError: 属性错误 print(b._B__pwd)  #alex3714

2.3方法私有化

class C:     def __ppt(self):    # 私有的方法         print('ppt')         self.age = 83     def open(self):         self.__ppt()         print('打开文件') c = C() c.open() print(c.age)

总结:

私有的 静态变量 对象属性 方法:     1.只能在类的内部定义和使用     2.在类外部使用私有静态变量  _类名__私有的名字     3.私有的名字 不能被子类继承

3.java

private 私有的  - __变量名 protect 保护的  - N/A(python中没有) public 公共的   - 正常的变量

4.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

class A:    def __fa(self): #在定义时就变形为_A__fa        print('from A')    def test(self):        self.__fa() #只会与自己所在的类为准,即调用_A__faclass B(A):    def __fa(self):        print('from B')b=B()b.test() #from A
View Code

二.内置函数property classmethod staticmethod

1.property :将一个方法伪装成属性。在用时用对象属性的方式调用 2.classmethod:将一个普通方法装饰为一个类方法.操作都只能和类中的静态变量相关 3.staticmethod:将一个方法装饰成普通函数。在类中装饰一个不需要self参数 也不需要cls参数的函数
 

1.property

class Circle:     def __init__(self,r):         self.r=r     @property     def area(self):         return self.r**2     @property     def prmite(self):         return self.r*2 c=Circle(5) print(c.area()) TypeError:此时area是属性 print(c.area)  #  25  用属性方法调用。不能用c.area
#####property属性和setter.delete合用###class Person:    def __init__(self,name):        self.__name=name    @property    def name(self):        return self.__name    @name.setter    def name(self,new_name):        if type(new_name)==str:           self.__name=new_name    @name.deleter    def name(self):        del self.__namealex=Person("alex")print(alex.name)alex.name="alex_sb"print(alex.name)del alex.name商品  价格 原价 打折 = 折后价class Goods:    def __init__(self,name,price,discount):        self.name = name        self.__price = price        self.discount = discount    @property    def price(self):        return self.__price * self.discountapple = Goods('apple',5,0.8)print(apple.price)
View Code

2.classmethod

类方法是被@classmethod装饰的特殊方法:     1.被装饰之后,方法默认接收一个 类 作为参数     2.之后所有的操作都只能和类中的静态变量相关 而不应该和对象相关   3.类名 和 对象名 都可以直接调用类方法
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    @classmethod     def change_discount(cls,new_dis):  # 类方法        cls.__discount = new_disGoods.change_discount(1)cig = Goods('cigrette',20)print(cig.price)cig.change_discount(0.2)print(cig.price)
View Code

3.staticmethod

class Student:    def __init__(self,name):        self.name = name    @staticmethod    #装饰一个不需要self参数 也不需要cls参数的函数    def login(a,b,c):    # 普通的函数        usr = input('username>>>')        pwd = input('password>>>')        if usr == 'alex' and pwd == '123':            obj = Student(usr)            return objret = Student.login(1,2,3)print(ret)
View Code
房间类 : 所有人 价格 面积
class Room:    def __init__(self,owner,price,length,width,height):        self.owner = owner        self.__price_single = price  #单价        self.__length = length        self.__width = width        self.height = height    def get_area(self):        return self.__length * self.__width    def get_price(self):        return self.__price_single * self.get_area()alex = Room('alex',1000000,2,1,0.8)print(alex.get_area())print(alex.get_price())
View Code

 

 
 
 

转载于:https://www.cnblogs.com/zgf-666/p/8541228.html

你可能感兴趣的文章
MUI框架开发HTML5手机APP(一)--搭建第一个手机APP(转)
查看>>
linux下使用 du查看某个文件或目录占用磁盘空间的大小
查看>>
Android水波纹特效的简单实现
查看>>
[wp7软件]wp7~~各种视频播放器下载大全
查看>>
Java工程师必知之事 —— 如何定义自己的职业路线?
查看>>
Java中对象并不是都在堆上分配内存的。
查看>>
代码质量与规范,那些年你欠下的技术债
查看>>
计算机程序的思维逻辑 (19) - 接口的本质
查看>>
自定义控件(二) 从源码分析事件分发机制
查看>>
CVE-2014-4113漏洞利用过程分析
查看>>
解密MSSQL链接数据库的密码
查看>>
Glide-源码详解
查看>>
你敢在post和get上刁难我,就别怪我装逼了
查看>>
直播 3.0 时代,在线教育行业的裂变和重构
查看>>
SpringBoot使用Nacos服务发现
查看>>
2017双11技术揭秘—阿里巴巴数据库技术架构演进
查看>>
我的友情链接
查看>>
Spring框架 - AOP使用
查看>>
Ansible常用内置属性
查看>>
C#使用正则表达式校验邮箱
查看>>