面向对象的三大特性:继承  多态  封装

封装:()

  广义上的:

  狭义上的:会为一种现象起一个专属它的名字

把函数和属性封装到一个非全局的命名空间

class A:

  __N = 'aaa'  静态变量

print(A.__N)

python

1.public

2.private

java(完全是面向对象的语言)

1.public

2.protect

3.private

定义一个私有的名字:就是在私有的名字面前加上双下划线 __N = 'aaa'

所谓私有就是不能再类的外面引用它

 class A:#     __N = 'aaa'  # 静态变量#     def func(self):#         print(A.__N)  # 在类的内部使用正常## a = A()# a.func()# print(A.__N) # 在类的外部直接使用 报错
class A:    __N = 'aaa'    def func(self):print(A.__N)

print(A.__dict__)print(A._A__N)

#{'func': <function A.func at 0x0000011B197637B8>, '__module__': '__main__', '__dict__': <attribute '__dict__' of 'A' objects>, '_A__N': 'aaa', '__doc__': None, '__weakref__': <attribute '__weakref__' of 'A' objects>}#aaa
# 一个私有的名字 在存储的过程中仍然会出现在A.__dict__中,所以我们仍然可以调用到。# python对其的名字进行了修改: _类名__名字# 只不过在类的外部调用 :需要“_类名__名字”去使用# 在类的内部可以正常的使用名字
 _A__N# 在类内 只要你的代码遇到__名字,就会被python解释器自动的转换成_类名__名字
# 私有的名字,在类内使用的时候,就是会变形成_该类名__方法名# 以此为例 :没有双下换线会先找E中的func# 但是有了双下划线,会在调用这个名字的类D中直接找_D__func
# 变形只在类的内部发生
# class D:
#     def __init__(self):
#         self.__func()
#     def __func(self):
#         print('in D')
#
# class E(D):
#     def __func(self):
#         print('in E')
# e = E()
# class F:pass# print(F.__dict__)# F.__name = 'aaa'# f = F()# print(f.__name)# print(F.__dict__)
 

# class F:pass
# print(F.__dict__)
# F.__name = 'aaa'
# f = F()
# print(f.__name)
# print(F.__dict__)
# class F:
#     def ADC(self):
#         self.__name = 'alex'
#
# f = F()
# f.ADC()
# print(F.__dict__)
# print(f.__dict__)

这个实例说明:在对象中创建的静态属性

Java中的对比:

public 共有的: 在类的内部可以使用,子类可以使用,在类的外部也可以使用  python中所有正常的名字

protect 保护的:在类的内部可以使用,子类可以使用,在类的外部不可使用  python中没有

private 私有的: 在类的内部可以使用,字类和在类的外部都不可使用。    python中的__名字

私有的用法:

  当一个方法不想被子类继承的时候:

  有些属性和方法不希望从外部调用,只希望从内部调用

# 人体BMI指数
# 体质指数(BMI)=体重(kg)÷身高^2(m)
# 写一个类 描述人体BMI指数class Person:def __init__(self,name,weight,height):self.name = nameself.__height = heightself.__weight = weight# self.bmi = self.__weight / self.__height ** 2# self.bmi = self.cal_BMI()def cal_BMI(self):return self.__weight / self.__height ** 2@propertydef bmi(self):return self.__weight / self.__height ** 2
p = Person('大表哥',92,1.85)

# print(p.cal_BMI())# p.cal_BMI()   # bmi是一个名词# print(p.bmi)   # bmi是一个名词# p._Person__weight = 90# print(p.bmi)
# 将一个方法伪装成一个属性 # 并不会让你的代码有什么逻辑上的提高 # 只是从调用者的角度上换了一种方式,使之看起来更合理
# @property 能够将一个方法伪装成一个属性# 从原来的的对象名.方法名(),变成了对象名.方法名# 只是让代码变的更美观

注意:如果出现了重名的名字:程序就会报错
# 将方法伪装成属性,方法中一般涉及的都是一些计算过程
# from math import pi
# class Circle:
#     def __init__(self,r):
#         self.r = r
#     @property
#     def area(self):
#         return self.r**2*pi
#
#     @property
#     def perimeter(self):
#         return 2*pi*self.r
# c = Circle(10)
# print(c.area)
# print(c.perimeter)
# c.r = 15
# print(c.area)
# print(c.perimeter)

因为property不能传参,所有如果还想要将动态函数名改为名词性函数名,就需要用到名词性函数名.settle

 方法伪装成的属性的修改
# class Person:
#     def __init__(self,n):
#         self.__name = n  # 私有的属性了
#     @property
#     def name(self):
#         return self.__name
#
#     @name.setter        # 重要程度 ***
#     def name(self,new_name):
#         if type(new_name) is str:
#             self.__name = new_name
#         else:
#             print('您提供的姓名数据类型不合法')
#
# p = Person('alex')
# print(p.name)       #def name(self):
# p.name = 'alex_sb' #def name(self,new_name):
# print(p.name)       #def name(self):
# p.name = 123 #def name(self,new_name):
# print(p.name)       #def name(self):

# 方法伪装成的属性的删除class Person:def __init__(self,n):self.__name = n # 私有的属性了 @property # 重要程度 **** def name(self):return self.__name# @name.deleter # def name(self): # print('name 被删除了') # @name.deleter # 重要程度* # def name(self): # del self.__name

# p = Person('alex')# print(p.name)# del p.name # 只是执行了被@name.deleter装饰的函数# print(p.name)

#@property --> func 将方法伪装成属性,只观看的事儿#@func.setter --> func 对伪装的属性进行赋值的时候调用这个方法 一般情况下用来做修改#@func.deleter --> func 在执行del 对象.func的时候调用这个方法 一般情况下用来做删除 基本不用

# 商品的 折扣# 有一个商品 : 原价 折扣# 当我要查看价格的时候 我想看折后价# class Goods:# def __init__(self,name,origin_price,discount):# self.name = name# self.__price = origin_price# self.__discount = discount## @property# def price(self):# return self.__price * self.__discount# @price.setter# def price(self,new_price):# if type(new_price) is int or type(new_price) is float:# self.__price = new_price# apple = Goods('apple',5,0.8)# print(apple.price)# # 修改苹果的原价# apple.price = 8# print(apple.price)
class Goods:    __discount = 0.8    def __init__(self,name,origin_price):self.name = nameself.__price = origin_price

@property def price(self):return self.__price * Goods.__discount

@classmethod def change_discount(cls,new_discount): # 类方法 可以直接被类调用 不需要默认传对象参数 只需要传一个类参数就可以了 cls.__discount = new_discount

Goods.change_discount(1) # 不依赖对象的方法 就应该定义成类方法 类方法可以任意的操作类中的静态变量apple = Goods('apple',5)banana = Goods('banana',8)print(apple.price)print(banana.price)

# 折扣变了 店庆结束 恢复折扣# apple.change_discount(1) # 如果要改变折扣 是全场的事情 不牵扯到一个具体的物品 所以不应该使用对象来调用这个方法# print(apple.price)# print(banana.price)

# staticmethod# 当一个方法要使用对象的属性时 就是用普通的方法# 当一个方法要使用类中的静态属性时 就是用类方法# 当一个方法要既不使用对象的属性也不使用类中的静态属性时,就可以使用staticmethod静态方法

# def login():# user= input('user :')# if user == 'alex':print('success')# else :print('faild')## login()class Student:def __init__(self,name):pass

 @staticmethod def login(a): # login就是一个类中的静态方法 静态方法没有默认参数 就当成普通的函数使用即可 user = input('user :')if user == 'alex':print('success')else:print('faild')

Student.login(1)

# 完全面向对象编程# 先登录 后 实例化# 还没有一个具体的对象的时候 就要执行login方法

# 使用什么样的方法要看具体用到了哪些名称空间中的变量 # 当一个方法要使用对象的属性时 就是用普通的方法 # 当一个方法要使用类中的静态属性时 就是用类方法 # 当一个方法要既不使用对象的属性也不使用类中的静态属性时,就可以使用staticmethod静态方法
 
 
 

 

转载于:https://www.cnblogs.com/zsdbk/p/8866649.html

day 22 封装 + property + classmethod + staticmethod相关推荐

  1. property classmethod staticmethod的用法

    一:property的用法 1,@property 能够将一个方法伪装成一个属性,它并不会让你的代码有什么逻辑上的提高,只是从调用者的角度上换了一种方式,使之看起来更合理.调用方法从原来的的对象名.方 ...

  2. python面试题之下面这些是什么意思:@classmethod, @staticmethod, @property?

    回答背景知识 这些都是装饰器(decorator).装饰器是一种特殊的函数,要么接受函数作为输入参数,并返回一个函数,要么接受一个类作为输入参数,并返回一个类. @标记是语法糖(syntactic s ...

  3. 下面这些是什么意思:@classmethod, @staticmethod, @property?

    @classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数.下面的例子展示了它们的用法和行为: class MyClass(object):de ...

  4. python中自带的三个装饰器_python三个自带装饰器的功能与使用(@property、@staticmethod、@classmethod)...

    本篇随笔只是记录我对这三个装饰器的理解,可能会有不准确的地方,敬请指出. property装饰器 功能:通过property装饰器控制类的属性的绑定与获取,一般就是给某个属性增加一个验证类型等功能. ...

  5. property、staticmethod、classmethod与__str__的用法

    import math class Circle:def __init__(self,radius): #圆的半径radiusself.radius=radius@propertydef area(s ...

  6. python学习day26 封装 property 类方法 静态方法 反射

    封装 广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种 只让自己的对象能调用自己类中的方法 狭义上的封装 -- 面向对象的三大特性之一 属性 和 方法都藏起来 不让你看见 私有属性 cl ...

  7. python继承实现原理封装property

    ---恢复内容开始--- 在Python中继承顺序有两种:深度优先和广度优先 没有共同父类的继承: class E:def test(self):print('from E') class A(E): ...

  8. 组合,多态,封装, @property

    目录 组合 什么是组合 为什么使用组合 如何使用组合 多态 什么是多态 多态性 - 好处 封装 封装是什么意思 @property 组合 什么是组合 ​ - 对象的某一个属性是另一个类的对象 clas ...

  9. Python: classmethod staticmethod 区别

    classmethod:类方法 staticmethod:静态方法 在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmethod 是一个函数修饰符,它表 ...

  10. python classmethod static_【python】classmethod staticmethod 区别

    其他参考: 比较好的讨论: classmethod:类方法 staticmethod:静态方法 在python中,静态方法和类方法都是可以通过类对象和类对象实例访问.但是区别是: @classmeth ...

最新文章

  1. 学习 JavaScript (四)核心概念:操作符
  2. OGG之Replicate进程
  3. [js] 说说防止重复发送ajax请求的方法有哪些?各自有什么优缺点?
  4. java -jar 内存溢出_JAVA系统启动栈内存溢出-StackOverflowError
  5. mysql和jfinal的区别_mysql与JFinal的数据关系-阿里云开发者社区
  6. opencms内容管理入门指南pdf_企业微信管理员训练营回顾(三) | 企业微信高效协作入门指南...
  7. 跟我一起学Vim补全神级插件--YouCompleteMe
  8. 【OpenCV入门指南】第一篇 安装OpenCV
  9. 《剑指offer》重建二叉树的解法
  10. Java同步问题_Java多线程同步问题
  11. 计算机二级access分数分布_计算机二级各部分分值分布
  12. 输出今天是星期几并计算n天后的日期(万年历)
  13. 电视机尺寸一览表2022
  14. 面对区块链,普通人应该做什么?
  15. Java生鲜电商平台-异常模块的设计与架构
  16. 精华文稿|用于无监督双目立体匹配学习的视差注意力机制
  17. 2021ICPC欧洲东南部区域赛题解ACFGJKLN
  18. 我不想关注你了,饭否
  19. 浪潮NF5280M4 服务器安装系统后无法启动
  20. 使用nat123怎样解决网速慢的问题?

热门文章

  1. caffe MNISTAutoencoder
  2. 如何通过代码设置WPF控件的字体,颜色
  3. bug篇——generator逆向出现配置文件不存在
  4. Java同步数据结构之ConcurrentLinkedDeque
  5. python开发环境及网络基础
  6. js排序算法05——快速排序
  7. markdown语法学习---半小时就能掌握--宋成光
  8. iOS-自定义导航栏后侧滑返回功能失效
  9. HashMap的key可以是可变的对象吗???
  10. 开始我们的Snippets!