初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)
封装
# class Room:
# def __init__(self,name,length,width):
# self.__name = name
# self.__length = length
# self.__width = width
# def get_name(self):#C++的编码习惯,一个get和一个set
# return self.__name
# def set_name(self,newName):
# if type(newName) is str and newName.isdigit() == False:
# self.__name = newName
# else:
# print('不合法的姓名')
# def area(self):
# return self.__length * self.__width
#
# jin = Room('金老板',2,1)
# print(jin.area())
# jin.set_name('2')
# print(jin.get_name()) # 假设父类的私有属性 能被 子类调用么
# class Foo:
# __key = '123' # _Foo__key
#
# class Son(Foo):
# print(Foo.__key) # _Son__key # 会用到私有的这个概念de场景
#1.隐藏起一个属性 不想让类的外部调用
#2.我想保护这个属性,不想让属性随意被改变
#3.我想保护这个属性,不被子类继承
property
# property
# 内置装饰器函数 只在面向对象中使用
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 self.r**2*pi # c1 = Circle(5)
# print(c1.area) # 圆的面积,面积和周长是一个名字,相当一个属性,所以我把他伪装成一个属性,看上去更合理,但不能像其他属性那样去外部更改,因为它是计算而得的
# print(c1.perimeter) # 圆的周长 # class Person:
# def __init__(self,name,high,weight):
# self.name = name
# self.high = high
# self.weight = weight
# @property
# def bmi(self):
# return self.weight / self.high**2 # jin = Person('金老板',1.6,90)
# jin.bmi = 18
# classmethod
# staticmethod # class Person:
# def __init__(self,name):
# self.__name = name
# @property
# def name(self):
# return self.__name + 'sb'
# @name.setter
# def name(self,new_name):
# self.__name = new_name
#
# tiger = Person('泰哥')
# print(tiger.name)
# tiger.name = '全班'#像要修改伪属性,要在上面加 @name.setter一段代码
,三个标红name必须一样 # print(tiger.name) # 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
# apple = Goods('苹果',5)
# print(apple.price) # 属性 查看 修改 删除
# 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
# brother2 = Person('二哥')
# del Person.price
# #brother2.name = 'newName'
# #brother2
# del brother2.name #deleter以及下方内容不会有删除的作用,当外部用del Person.price就会触发找到@name.deleter,然后执行下方函数的删除私有属性 动作 # print(brother2.name)#这里的不是删除name方法名,而是去执行删除属性的方法,对象是没权删除类里的方法的
class_static
# method 方法
# staticmathod 静态的方法 ***
# classmethod 类方法 ****
# 类的操作行为
# 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_discount): # 修改折扣
# cls.__discount = new_discount
# apple = Goods('苹果',5)
# print(apple.price)
# Goods.change_discount(0.5) # Goods.change_discount(Goods)
# print(apple.price)
# 当这个方法的操作只涉及静态属性的时候 就应该使用classmethod来装饰这个方法
# java
class Login:
def __init__(self,name,password):
self.name = name
self.pwd = password
def login(self):pass
@staticmethod
def get_usr_pwd(): # 静态方法
usr = input('用户名 :')
pwd = input('密码 :')
Login(usr,pwd)
Login.get_usr_pwd()
# 在完全面向对象的程序中,
# 如果一个函数 既和对象没有关系 也和类没有关系 那么就用staticmethod将这个函数变成一个静态方法
# 类方法和静态方法 都是类调用的
# 对象可以调用类方法和静态方法么? 可以 一般情况下 推荐用类名调用
# 类方法 有一个默认参数 cls 代表这个类 cls
# 静态方法 没有默认的参数 就象函数一样
下周内容
# 面向对象的进阶
# 网络编程
初识面向对象-封装、property装饰器、staticmathod(静态的方法)、classmethod(类方法) (五)的更多相关文章
- 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一. 引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...
- Python使用property函数和使用@property装饰器定义属性访问方法的异同点分析
Python使用property函数和使用@property装饰器都能定义属性的get.set及delete的访问方法,他们的相同点主要如下三点: 1.定义这些方法后,代码中对相关属性的访问实际上都会 ...
- Python10/24--组合/封装/property装饰器/多态
组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=111 ...
- [转载]Python使用@property装饰器--getter和setter方法变成属性
原贴:为什么Python不需要getter和setter getter 和 setter在java中被广泛使用.一个好的java编程准则为:将所有属性设置为私有的,同时为属性写getter和sette ...
- 第7.27节 Python案例详解: @property装饰器定义属性访问方法getter、setter、deleter
上节详细介绍了利用@property装饰器定义属性的语法,本节通过具体案例来进一步说明. 一. 案例说明 本节的案例是定义Rectangle(长方形)类,为了说明问题,除构造函数外,其他方法都只 ...
- @property 装饰器
property() 函数作用于新式类,返回属性值. class C(object): def __init__(self): self._x = None def getx(self): print ...
- 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析
一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...
- 绑定方法和隐藏属性之property装饰器
目录 一:绑定方法 1.绑定给对象的方法 2.绑定给类的方法 3.非绑定方法之静态方法 二,隐藏属性 1.如何隐藏属性 三,property 装饰器 一:绑定方法 1.绑定给对象的方法 class P ...
- 面向对象之封装 及@property装饰器使用
目录 封装 1.封装的定义 2.封装的目的: 3.封装的三种方式 4.封装的优点 5.访问限制(封装) @property 装饰器 属性property底层实现 封装 1.封装的定义 将复杂的丑陋的, ...
随机推荐
- springMVC使用@RequestParam用于处理简单类型的绑定
使用@RequestParam常用于处理简单类型的绑定. value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入: req ...
- MySQL相关知识总结
1. 显示所有表 show tables; 还有information_schema数据库里面有tables表,记录了所有表信息 use information_schema; select * fr ...
- javax.mail 发送邮件 , greenMail 测试 , spring
发送邮件接口: package com.manxu.archetype.account.email; import javax.security.auth.login.AccountException ...
- chandy-lamport 分布式一致性快照 算法详细介绍
在一个分布式计算系统中,为了保证数据的一致性需要对数据进行一致性快照.Flink和spark在做流失计算的时候都借鉴了chandy-lamport算法的原理,这篇文章就是对chandy-lamport ...
- SPSS--回归-多元线性回归模型案例解析
多元线性回归,主要是研究一个因变量与多个自变量之间的相关关系,跟一元回归原理差不多,区别在于影响因素(自变量)更多些而已,例如:一元线性回归方程 为: 毫无疑问,多元线性回归方程应该为: 上图中的 x ...
- 图片适应bitmap的大小 http上传文件
image.setAdjustViewBounds(true); http上传文件 http://www.eoeandroid.com/thread-90209-1-1.html http://www ...
- HDU6026 Deleting Edges 2017-05-07 19:30 38人阅读 评论(0) 收藏
Deleting Edges Time ...
- SoC FPGA开发板的FPGA配置数据下载和固化
小梅哥编写,未经许可,严禁用于任何商业用途 2018年7月2日星期一 soc fpga的烧写和固化方式与传统的纯fpga固化方式即存在形式上的相同,也存在细节上的差异,特整理此文. AC501-So ...
- JAVA实现WC.exe功能
项目要求 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能要求: 程序处理用户需求的模式为: wc.exe [paramet ...
- cocos2dx lua 图片去色shader
function FreeCardTool:setNodeGray(node) local vertShaderByteArray = "\n".. "attribute ...