1,包内部不要去尝试应用使用相对导入,一定不会成功的,他不支持这个机制,包内导入时一定要用绝对导入

2,复习接口类,抽象类,Python中没有接口类,有抽象类,抽象类是通过abc模块中的metaclass = ABCMeta 和@abstractmethod实现的

3,接口类和抽象类本质是做代码规范用的,我希望在子类中实现和父类方法名完全一样的方法

4,二者区别,在JAVA的角度看是有区别的,JAVA没有多继承,所以为了接口隔离原则,就设计了接口这个概念,支持多继承;JAVA本来就支持单继承,所以就有了抽象类。Python中既支持单继承,也支持多继承,所以对于接口类和抽象类的区别就不那么明显了。甚至在Python中根本没有接口类,但是Python的扩展模块中有一个模块确实实现了接口类的概念,所以不能说根本没有,只是内置模块中没有,没有内置接口类。

5,多态和鸭子类型,多态---Python天生支持多态,给子类找个爸爸,传爸爸的参数,Python里面崇尚鸭子类型,不依赖父类的情况下,实现两个类中的同名方法。

6,封装 ---私有的,在Python中只要__名字,就把这个名字私有化了,私有化之后,就不能从类的外部直接调用了,可以私有的有静态属性方法,对象的属性都可以私有化,这种私有化只是从代码级别做了变形,并没有真的约束,变形机制 _类名__方法。在类外用这个调用,在类的外部__名字调用。

7,私有属性

class Room:
def __init__(self,name,length,width):
self.name = name
self.__length =length
self.__width = width def area(self):
return self.__length * self.__width jin = Room('jin',3,5)
print(jin.area())
jin.name = 'lisa'
print(jin.name)

8,get set 方法保护属性不被修改,私有属性的查看方法

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,new_name):
if type(new_name) is str and new_name.isdigit() == False:
self.__name = new_name
else:
print('invalid name') def area(self):
return self.__length * self.__width jin = Room('jin',3,5)
jin.name = '' # 不是私有的话,可以随便改,要想办法约束一下
print(jin.name) jin.set_name('lisa')
print(jin.get_name())
# C++ 里面所有的属性都设置成私有的,

9,父类的私有属性可以被子类调用吗?否

class Foo:
__key = '' _Foo__key class Son(Foo):
print(Foo.__key) #_Son__key # 此句报错,由于不可以调用
# AttributeError: type object 'Foo' has no attribute '_Son__key

10,总结:会用到私有概念的场景,隐藏起一个属性,不想让类的外部调用;我想保护这个属性,不想让属性随意被改变;我想保护这个属性不被子类继承

11,之前老师欠着的三个内置函数:property,classmethod,staticmethod

12,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.area)
print(c1.perimeter)
# c1.area = 70 # 不支持赋值

13,BMI指数,方法伪装的属性,不被允许修改,怎么办?

class Person:
def __init__(self,name,high,weight):
self.name = name
self.high = high
self.weigh = weight
# self.bmi = wight / (high **2) # 这样写虽然可以,但是不规范,操作属性的方法我们都是会在方法里面来写,各司其职,才更合理 @property
def bmi(self):
return self.weigh/self.high**2 jin = Person('jin',1.75,70)
# print(jin.bmi())
print(jin.bmi)
jin.name = 'tiger'
# jin.bmi = '23' # 不允许修改,怎么办?

14,方法一,name.setter 和 name.deleter

class Person:
def __init__(self,name):
self.__name = name @property
def name(self):
return self.__name + ' nb' @name.setter
def name(self,new_name): # 虽然是同名函数,但是不会覆盖
self.__name = new_name @name.deleter
def name(self):pass # 里面不实现的话,是没有办法删除的def self.name tiger = Person('tiger')
# print(tiger.name()) # tigernb,另外改成property之后就不可以这样覅用了
print(tiger.name) tiger.name = 'all students' # 无法修改怎么办?再定义一个函数
print(tiger.name) del tiger.name # 删除属性
print(tiger.name) # 注意三个函数的名字必须一样,并且一定要有一个@property方法,才可以有后面两个

15,和类属性的结合

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('apple',5)
print(apple.price)

16,staticmethod 静态的方法 三颗星,classmethod 类方法 四颗星,property 四星半,重要程度,私有属性,五颗星

17,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): # 去掉self,我们不推荐这样写,标准写法,不要写成其他的
cls.__discount = new_discount # apple = Goods('apple',5)
# print(apple.price) # 这个折扣修改的动作,我们如何不自己来完成,而是用一个函数来完成?
# 如果我们定义成一个对象函数,那么我必须拿一个对象来进行折扣的修改,但是这个折扣是类属性,我希望所有的对象都自动修改
# 而不是通过某一个
# apple.change_discount(0.7)
Goods.change_discount(0.9)
# 当这个方法的操作只涉及静态属性的时候,就应该使用classmethod

18,staticmethod,如果一个函数本身和类和对象都没有什么关系,但是我就想把这个函数写入到类里面,想象春面向对象的语言,例如JAVA,C#

class Login:
def __init__(self,name,password):
self.name = name
self.pwd = password def login(self):pass @staticmethod # 不需要和类和对象产生任何关系,但是还可以放在类里面
def get_usr_pwd(): # 必须把它扔进类里面,才是面向对象
input('input usrname:')
input('input password:') l = Login('alex','')
l.get_usr_pwd() # 静态方法既可以被对象来访问,也可以用类来访问
Login.get_usr_pwd() # 何时使用静态方法
# 在完全面向对象的程序中,如果一个函数,既和对象没有关系,也和类没有关系,那么就用staticmethod将这个函数编程一个静态方法 # 类方法和静态方法都是类来调用的,那么对象可以调用吗?
# 可以的,想象对象可以调用静态属性吗?一样的道理,但是一般情况下,推荐用类名来调用
# 类方法,有一个默认参数 cls 代表这个类
# 静态方法,没有默认参数,就像函数一样

19,反射,非常重要,五颗星,把字符串当变量使用

# name = 'lisa'
# 'name' class Teacher:
dic = {'show stu info','show teacher info'} def show_student(self):
print('show student') def show_teacher(self):
print('show teacher') # menu = Teacher.dic
# for k in menu:
# print(k) 'dic' # 最后三个内置函数
# hasattr
# getattr
# defattr ret = getattr(Teacher,'dic') # 左右对应 Teacher.dic
print(ret) # {'show stu info', 'show teacher info'} # python中一切皆是对象,包括类和模块

20,反射类属性和类方法

class Teacher:
dic = {'show stu info','show teacher info'} def show_student(self):
print('show student') def show_teacher(self):
print('show teacher') @classmethod
def func(cls):
print('hahaha') ret = getattr(Teacher,'dic') # 左右对应 Teacher.dic,类.属性
print(ret) # {'show stu info', 'show teacher info'} ret2 = getattr(Teacher,'func')
ret2() # hahaha if hasattr(Teacher,'func2'):
ret = getattr(Teacher,'func')
ret() if hasattr(Teacher,'dic'):
ret = getattr(Teacher,'dic')
print(ret)

21,反射对象方法

# 反射对象函数
lisa = Teacher()
func = getattr(lisa,'show_student')
func()

22,使用实例,有了反射我就不用去一条条判断了,我只需要一条反射,去掉用相应的方法就行了,反射的妙用

for k in Teacher.dic:
print(k) key = input("输入需求:")
# print(Teacher.dic[key])
# 这个地方好在不需要去判断if key = 1 怎么样,key =2怎么样,用反射,程序自动就去调用了
if hasattr(lisa,Teacher.dic[key]):
func = getattr(lisa,Teacher.dic[key])
func()

23,反射非常的重要,也许现在只在面向对象这儿还体会不到他的好,但是到了以后网络编程,文件操作的时候,会用的非常多

24,通过反射可以对象名获取对象属性和普通方法,类名获取静态属性和类方法和静态方法

25,面向对象思维导图和计算器作业先欠着,后补

day26:静态方法,类方法和反射的更多相关文章

  1. IOS—静态方法(类方法)和实例方法

    1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象    函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类    函数) c).静态方法 ...

  2. IOS基础——静态方法(类方法)和实例方法

    1.实例方法/动态方法 a).标识符:- b).调用方式:(实例对象    函数) c).实例方法在堆栈上. 2.静态方法/类方法 a).标识符:+ b).调用方式:(类    函数) c).静态方法 ...

  3. Java学习日记基础(五)——类、对象之this、静态变量(类变量)、静态方法(类方法)、四大特征

    this 赵本山问奥尼尔:“我的爸爸的爸爸是谁?” 奥尼尔:“不知道” 赵本山:“你傻啊,是我爷爷” 奥尼尔回去问科比:“我的爸爸的爸爸是谁?” 科比:“不知道” 奥尼尔:”你傻啊,是赵本山的爷爷“ ...

  4. python类的实例方法\静态方法\类方法区别解析(附代码)

    前言 搞了好久python,一直搞得不太清楚这几种类的方法,今天花时间好好测试一下,算是弄懂点皮毛吧. 三种方法的不同 先剽窃个图看一下 可以看到,实例是三种方法都可以调用的,而类只可以调用两种.所以 ...

  5. python面向对象之静态属性/静态方法/类方法/组合

    继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...

  6. python静态方法类方法属性方法

    Python的静态方法和类成员方法都可以被类或实例访问,两者概念不容易理清,但还是有区别的: 1)静态方法无需传入self参数,类成员方法需传入代表本类的cls参数: 2)从第1条,静态方法是无法访问 ...

  7. Py修行路 python基础 (十七)property 静态方法 类方法

    一.property 属性 特性 (装饰器是可调用对象,被装饰对象也是可调用对象)   1.在类内函数属性上添加一个@property,就会对函数属性进行伪装. import math class C ...

  8. python__高级 : 动态添加 对象属性, 类属性, 对象实例方法, 类静态方法, 类方法

    给对象添加实例属性,可以直接这样  t.age = 18   ( 假设 t = Test() )  给类添加类属性 , 也可以直接这样  Test.age = 18 那给对象添加实例方法,可以在类外面 ...

  9. Python静态方法 类方法

    通常情况下,类中函数中定义的所有函数,,都是对象的绑定方法,除此之外,还有专门的静态方法和类方法,这两个是专门给类使用的,但是对象非要调用也是不会报错的. 对象在调用的时候会把自己传递给self,也就 ...

随机推荐

  1. 如果在ie上报错又找不到问题原因该怎么办?

    我司项目需要兼容IE浏览器 QQ浏览器 360浏览器,调了几天发现QQ跟360都没问题了然后只剩下一个问题就是IE上报错了!!! 然后去百度找了各种原因  最后发现在IE浏览器这种引入方式无法解析会报 ...

  2. 【译】索引进阶(一):SQL SERVER索引介绍

      [译注:此文为翻译,由于本人水平所限,疏漏在所难免,欢迎探讨指正]  原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/7 ...

  3. Django组件-用户认证

    用户认证 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenti ...

  4. 堆溢出学习笔记(linux)

    本文主要是linux下堆的数据结构及堆调试.堆溢出利用的一些基础知识 首先,linux下堆的数据结构如下 /* This struct declaration is misleading (but a ...

  5. 使用virtualenvwrapper模块管理python虚拟环境

    1.pip安装virtualenvwrapper [root@localhost ~]# pip install virtualenvwrapper # 安装virtualenvwrapper [ro ...

  6. VMware虚拟机从一台电脑复制到另一台电脑

    1.选中.vmx文件和所有的.vmdk文件,添加到压缩文件 vmx是虚拟系统配置文件,而vmdk则是虚拟磁盘文件,它们都是VMware所支持的文件格式 2.复制压缩文件到另一台电脑上,并解压 3.在另 ...

  7. Redis高可用技术解决方案总结

    一.常见使用方式 Redis的几种常见使用方式包括: Redis单副本: Redis多副本(主从): Redis Sentinel(哨兵): Redis Cluster: Redis自研. 二.各种使 ...

  8. Linux 目录结构和常用命令

    Linux目录结构 目录 说明 bin 存放二进制可执行文件(ls,cat,mkdir等) boot 存放用于系统引导时使用的各种文件 dev 用于存放设备文件 etc 存放系统配置文件 home 存 ...

  9. SQL反模式学习笔记10 取整错误

    目标:使用小数取代整数 反模式:使用Float类型 根据IEEE754标识,float类型使用二进制格式编码实数数据. 缺点:(1)舍入的必要性: 并不是所有的十进制中描述的信息都能使用二进制存储,处 ...

  10. 一、自动化平台搭建-python虚拟环境安装

    主要知识点介绍: 安装django环境 创建django项目 设计模型类并利用模型类和数据库进行交互 使用django后台管理数据 编写视图函数,进行URL配置 模板的使用 图书-英雄案例完成 1.虚 ...