一. 封装

class Room:
def __init__(self, name, length, width):
self.__name = name
self.__length = length
self.__width = width
def get_name(self):
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('金老板的小窝', 5, 10)
print(jin.area())
jin.set_name('')
print(jin.get_name())
# 假设父类的私有属性,能被 子类 调用吗? 不能
class Foo:
__key = '' # _Foo__key class Son(Foo):
print(Foo.__key) # _Son__key
会用到私有的这个概念的场景
1. 隐藏起一个属性 不想让类的外部调用
2. 我想保护这个属性,不想让属性随意被改变
3. 我想保护这个属性,不被子类继承

二. 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 pi * self.r**2
c1 = Circle(10)
print(c1.area) # 圆的面积
print(c1.perimeter) # 圆的周长

class Count_bmi:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height
@property
def bmi(self):
return self.weight / (self.height**2)
kidd = Count_bmi('KID', 51, 1.68)
print(kidd.bmi)
kidd.bmi = 23 # 不能改 class Person:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name + 'SB'
@name.setter
def name(self, newName):
self.__name = newName
p = Person('qqq')
print(p.name)
p.name = 'ppp'
print(p.name)

class Goods:            # 定义一个超市物品
discount = 0.5 # 全场5折
def __init__(self, name, price):
self.name = name
self.__price = price
@property
def price(self):
return self.__price * Goods.discount apple = Goods('苹果',4)
print(apple.price)
# 属性:查看 修改 删除
# 刚才学了 查看 修改 ,接下来看看怎么删除(不常用)
class Person:
def __init__(self, name):
self.__name = name
@property
def name(self):
return self.__name
@name.deleter
def name(self):
print('执行了这个方法')
del self.__name
@name.setter
def name(self,newName):
self.__name = newName
p = Person('二哥')
print(p.name)
del p.name
print(p.name) # 在查看就会报错,因为已经删除

三. 类方法

class Goods:            # 定义一个超市物品
__discount = 0.5 # 全场5折
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, newDiscount): # 修改折扣
cls.__discount = newDiscount
apple = Goods('苹果',4)
print(apple.price)
Goods.change_discount(0.8) # Goods.change_discount(Goods)
print(apple.price)
当这个方法的操作只涉及静态属性时,就应该使用calssmethod来装饰这个方法
class Login:
def __init__(self, name, password):
self.name = name
self.password = password
def login(self):
pass
@staticmethod
def get_usr_pwd(): # 静态方法
usr = input('用户名:')
pwd = input('密码:')
Login(usr,pwd)
Login.get_usr_pwd()
在完全面向对象的程序中
如果一个函数既和对象没有关系 也和类没有关系 那么就用staticmethod 将这个函数改变成一个静态方法 类方法 和 静态方法 都是类调用的
那么对象可以调用 类方法 和 静态方法 吗? 可以 一般情况下 推荐用类名调用
类方法 有一个默认参数 cls 代表这个类,可以改变这个名字,但不建议改变(与self代表对象似的)
静态方法 没有默认的参数 就像函数一样

四. 初识反射

name = 'alex'

class Teacher:
dic = {
'查看学生信息':'show_student',
'查看讲师信息':'show_teacher'
}
def show_student(self):
print('show_student')
def show_teacher(self):
print('show_teacher')
@classmethod
def func(self):
print('哈哈哈')
alex = Teacher()
for k in Teacher.dic:
print(k)
key = input('输入需求:')
# print(Teacher.dic[key])
if hasattr(alex,Teacher.dic[key]):
func = getattr(alex,Teacher.dic[key])
func() # # alex.show_student() 'show_student'
# func = getattr(alex,'show_student')
# func() # hasattr getattr delattr
# if hasattr(Teacher,'dic'):
# ret = getattr(Teacher,'dic') # Teacher.dic # 类也是对象
# ret2 = getattr(Teacher,'func') # 类.方法 Teacher.func
# print(ret)
# print(ret2)
# ret2()
# menu = Teacher.dic
# # for k in menu:
# # print(k)
# 通过反射
# 对象名 获取对象属性 和普通方法
# 类名 获取静态属性 和 类方法 和 静态方法
普通方法 带self
静态方法 @staticmethod
类方法 @classmethod
属性方法 @property

python学习之老男孩python全栈第九期_day026知识点总结——封装、property、类方法、初识反射的更多相关文章

  1. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  2. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  3. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  4. python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

    一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...

  5. python学习之老男孩python全栈第九期_day010知识点总结

    def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...

  6. python学习之老男孩python全栈第九期_day007知识点总结

    基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...

  7. python学习之老男孩python全栈第九期_day001知识点总结

    1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...

  8. python学习之老男孩python全栈第九期_day014知识点总结

    # 迭代器和生成器# 迭代器 # 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir ...

  9. python学习之老男孩python全栈第九期_day016知识点总结

    '''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...

随机推荐

  1. angular核心原理解析1:angular自启动过程

    angularJS的源代码整体上来说是一个自执行函数,在angularJS加载完成后,就会自动执行了. angular源代码中: angular = window.angular || (window ...

  2. Common xaml controls(补交作业)

    Common xaml controls 常见的xaml控件: 先上一段代码,把他们基本都实现出来: <Grid Name="MyGrid"> <Button N ...

  3. python中的字符串和编码

    了解编码之前首先说下这几个词的概率: 位.字节.字符.字符串 1.位(bit)也称为比特 这个其实很简单,因为计算机都是二进制存储数据,也就是0和1,一个0或者1就表示一位.这是计算机存储的最小单位. ...

  4. 考试题T3

    题意分析 这题一看没有什么思路 幸好我们机房的红太阳\(ghj1222\)切了这道题 首先我们考虑风跑一个来回之后人怎么样 就是跑了一个区间 也就是风跑了若干个来回之后 人跑了若干个区间 所以我们考虑 ...

  5. 【Qt开发】实现系统托盘,托盘菜单,托盘消息

    概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo ...

  6. js 封装trim()方法,去掉空格

    <script> //定义一个对象 - 名字是$ var $$ = function() {}; //原型 $$.prototype = { $id:function(id) { retu ...

  7. docker阿里云镜像加速器使用

    加速器使用:加快镜像下载速度 访问www.aliyun.com: 登录之后点击”控制台“,选择“产品与服务“: 选择“容器镜像服务“: 设定密码后选择“镜像加速器”:  这里会有一个加速器地址:  在 ...

  8. linux centOS 7 GUI安装

    centOS 7 GUI 图形用户界面(Graphical User Interface 克隆clone Windows中安装xshell和xftp传输软件 https://blog.csdn.net ...

  9. 【VS2015】关于VS2015如何运行的问题

    各位看官,lt's been a long time since we met last time. 是否习惯了CodeBlocks那种简易编写C文件?一到写工程就懵逼的状态?今天我给他们带来如何让C ...

  10. 服务器反爬虫攻略:Apache/Nginx/PHP禁止某些User Agent抓取网站

    我们都知道网络上的爬虫非常多,有对网站收录有益的,比如百度蜘蛛(Baiduspider),也有不但不遵守robots 规则对服务器造成压力,还不能为网站带来流量的无用爬虫,比如宜搜蜘蛛(YisouSp ...