python(二)面向对象知识点
模块
别名
import my_module as xxx(别名)
先导入内置模块
再导入第三方模块
再导入自定义模块
from my_module(导入的文件) import *(变量)
__all__ 能够约束*导入的变量的内容
# 在导入的文件里写 __all__=['name']
from my_module import name(要导入的变量)
* 模块之间不能循环引用
* 已经导入的模块发生修改,是不会被感知到的
* 要想修改的模块正在运行中的程序感知到,重启这个程序
一个文件中的__name__变量
* 当这个文件被当作脚本执行的时候 __name__=='__main__'
if __name__ == '__main__':
# 代码
* 当这个文件被当作模块导入的时候 __name__=='模块的名字'
包: 文件夹中有一个__init__.py文件
包: 是几个模块的集合
从包中导入模块
目录结构
glance
----api
----__init__.py
----policy.py
#绝对导入
# 在执行一个py脚本的时候,这个脚本以及和这个脚本同级模块中只能用绝对导入
import glance.api.policy as policy
policy.get() #别名导入
import glance.api import policy
policy.get()
# 相对导入
# 含有相对导入的文件不能被直接执行
from . import policy
python中支持两种编程方式
# 面向对象
# 函数式编程
定义
class 类名:
def __init__(self): # 该方法自动执行
pass
def 函数名(self):
pass
x1=类名() # 创建了一个对象/实例化一个对象
x1.函数名()
构造方法
class Foo:
def __init__(self,name):
self.name=name
self.age=18
obj=Foo('张三')
#-----------
class UserInfo:
def func1(self):
print('func1')
self.func2()
def func2(self):
print('func2')
obj=UserInfo()
obj.func1()
#------
在指定类中编写和当前类相关的所有代码+提取公共
class Person:
def __init__(self,na,gen,age,fig):
self.name=na
self.gender=gen
self.age=age
self.fight=fig
def grassland(self):
self.fight=self.fight-10
def practice(self):
self.fight=self.fight+10
dong=Person('张三','女',12,400)
面向对象三大特性:封装/继承/多态
封装
将相关的功能封装到一个类中
class Message:
def email(self):pass
def msg(self):pass
将数据分装到一个对象中
class Person:
def __init__(self,name,age):
self.name=name
self.age=age
obj=Person('xiaoming',12)
继承
class SuperBase: # 父类,基类
pass
class Base(SuperBase):# 子类,派生类
pass
就近原则
多继承(先找左/再找右)
class Base1:
pass
class Base2:
pass
class Foo(Base1,Base2):
pass
self 是那个类的对象,那么就从该类开始找(自己没有就找父类)
* 特点提高代码的复用性
多态
多种形态,对传的参数没有要求,支持多种类型,所有默认支持多态
类的成员
- 变量(字段)
- 实例变量(字段)
- 类变量(静态字段)
class Foo:
# 类变量
country='中国'
def __init__(self,name):
# 实例变量
self.name=name
准则
* 实例变量(字段)访问时,使用对象访问
* 类变量(静态字段)访问是,使用类方法访问
什么时候用类变量
当所有对象中有共同的字段是,且要改都改要删都删时,可以把实例变量改成类变量
私有变量
__name
class Foo:
__country="zhongguo" #私有类变量
def __init__(self,name):
self.__name=name
def func(self):
print(self.__name)
# 静态方法
* 编写时:
-方法上方写 @staticcmethod
-方法参数可有可无
* 调用时
-类.方法名() *
-对象.方法名()
* 如果方法无需使用对象中分装的值,那么就可以使用静态方法
class Foo:
def __init__(self, name):
self.__name = name
# 实例方法
def func1(self):
print(self.__name)
# 静态方法,如果方法无序使用对象中封装的值,那么就可以使用静态方法
@staticmethod
def display():
print('555')
# 类方法
@classmethod
def show(cls,x1,x2):# cls 是类(就是把这个类作为参数传到里面)
print(cls,x1,x2)
obj=Foo('张三')
obj.func1()
Foo.display()
# 执行类方法
Foo.show(1,8)
# 类方法
> 定义时
- 方法上写 @classmethod
- 方法的参数: 至少有一个cls参数
> 执行时
- 类名.方法() # 默认会将当前类传到参数中
> 什么时候用
- 方法中用到了当前类
属性
> 编写时
- 方法上写 @property
- 方法参数:只有一个self
> 调用时:无序加括号 对象.方法
> 应用场景:对于简单的方法,当无序传参的时候
@property
class Foo:
def __init__(self, name):
self.__name = name
# 属性
@property
# def __func1(self) #私有属性
def func1(self):
return 1
obj=Foo()
print(obj.func1)
组合
class Stark:
def __init__(self,num):
self.num=num
def changelist(self,request):
print(self.num,request)
class Role(Stark):
pass
config_obj_list=[Stark(1),Stark(2),Stark(3)]
for item in config_obj_list:
print(item.changelist(120))
# 主动调用其他类的成员
class Base:
def f1(self):
print('3个功能')
class Foo(object):
def f1(self):
print('5个功能')
Base.f1(self) #主动调用其他类的成员
obj=Foo()
obj.f1()
# 第二种
class Base:
def f1(self):
print('3个功能')
class Foo(Base):
def f1(self):
print('5个功能')
super().f1() # 按照父类的继承顺序找
特殊成员
class Foo:
def __init__(self, a1, a2):
self.a1 = a1
self.a2 = a2
def __call__(self, *args, **kwargs):
print(111,args,kwargs)
def __getitem__(self, item):
print(item)
def __setitem__(self, key, value):
print(key,value)
def __delitem__(self,key):
print(key)
def __add__(self,other):
return self.a1+other.a2
# 类名() 自动调用 __init__
obj=Foo(1,2)
# 对象() 自动执行 __call__
obj(5,12,12,31)
type() #查看类型
# 对象[] 自动执行 __getitem__
obj['yu']
# 对象['xx]=11 自动执行 __setitem__
obj['xxx']='ggg'
# del 对象['xx] 自动执行__delitem__
# 对象+对象 自动执行 __add__
obj=Foo(1,2)
obj2=Foo(55,33)
ret=obj2+obj
print(ret) # 55+2
# with 对象 自动执行 __enter__/__exit__
class Foo:
def __init__(self, a1, a2):# 初始化
'''
对空对象进行数据初始化
'''
def __new__(cls, *args, **kwargs): # 构造方法
'''
创建一个空对象
'''
obj=Foo(1,2)
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
__dict__ 把参数以字典的形式打印出来
obj = Foo('ximing',33)
obj1=Foo('xiaohua',12)
print(obj.__dict__)
print(obj1.__dict__)
__iter__ 可迭代对象
issubclass/type/isinstance
issubclass(a,b) #检查第一个参数是否是第二个参数的 子子孙孙类
class Foo:
def __init__(self, name, age):
self.name = name
self.age = age
obj=Foo('张三',12)
print(type(obj)==Foo) # True 获取当前对象是由那个类创建的
isinstance(obj,Foo) # 检查第一个参数是否是第二个参数(类及父类)的实例
判断是否被调用
callable(obj)
方法和函数
类,方法
外,函数
对象.xxx--->xxx就是方法
类.xxx --->xxx就是方法
xxx ----> xxx就是函数
打印查看
function
method
反射
v=getattr(obj,'func')
# 根据字符查为参数(第二个参数),去对象(第一个参数)中寻找与之同名的成员
class Account(object):
func_list = ['login', 'logout', 'register']
def login(self):
print('登录')
def logout(self):
print('注销')
def register(self):
print('注册')
def run(self):
print('请输入要执行的功能:'
'0:登录'
'1:注销'
'2:注册')
choice=int(input("请输入要执行的序号"))
func_name=Account.func_list[choice]
func=getattr(self,func_name)
func()
obj=Account()
obj.run()
hasattr #根据字符串的形式,去判断对象是否有成员
setattr # 设置一个成员
delattr # 删除一个成员
类的约束
class BaseMessage:
def send(self):
# 必须继承BaseMessage 然后其中必须编写send方法,用于完成具体业务逻辑
raise NotImplementedError('.send() 必须被重写')
class Email(BaseMessage):
pass
obj=Email()
obj.send() # 会报错
################################################################################################################################################################################################################################################################################################################################################################################################################...............................................................................................................
python(二)面向对象知识点的更多相关文章
- Python 基础 面向对象之二 三大特性
Python 基础 面向对象之二 三大特性 上一篇主要介绍了Python中,面向对象的类和对象的定义及实例的简单应用,本篇继续接着上篇来谈,在这一篇中我们重点要谈及的内容有:Python 类的成员.成 ...
- python 历险记(二)— python 的面向对象
目录 前言 类和对象 如何定义和实例化类? 如何定义和使用属性? 什么是方法? 静态方法和普通方法 构造函数该怎么写? str 方法怎么写? 多态是什么? 继承性和 java 是一样的吗? 父类和子类 ...
- Python数据分析--Pandas知识点(二)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. Python数据分析--Pandas知识点(一) 下面将是在知识点一的基础上继续总结. 13. 简单计算 新建一个数据表 ...
- python基础--面向对象基础(类与对象、对象之间的交互和组合、面向对象的命名空间、面向对象的三大特性等)
python基础--面向对象 (1)面向过程VS面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. ...
- C#基础总结之八面向对象知识点总结-继承与多态-接口
.方法深入讲解(返回值,形参与实参) 方法 public int getName(int i,int j) { int sum = i + j; return sum; } .利用泛型存储对象数据 . ...
- C#基础总结之七面向对象知识点总结1
class Class //定义一个类 名字是Class { ; string NAME; string deptName; ; //如果是常量 只能获取,不能赋值 public string Nam ...
- Python进阶---面向对象的程序设计思想
Python的面向对象 一.面向过程与面向对象的对比 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
- Python之面向对象一
引子 小游戏:人狗大战 角色:人和狗 角色属性:姓名,血量,战斗力和性别(种类) 技能:打/咬 用函数实现人打狗和狗咬人的情形 def Dog(name,blood,aggr,kind): dog = ...
- python基础——面向对象的程序设计
python基础--面向对象的程序设计 1 什么是面向对象的程序设计 面向过程的程序设计的核心是过程,过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优 ...
随机推荐
- python 学习之 基础篇二 字符编码
声明: 博文参考1:字符编码发展历程(ASCII,Unicode,UTF-8) 博文参考2:Python常见字符编码间的转换 (1)为什么要用字符编码 早期的计算机使用的是通电与否的特性的真空管,如果 ...
- NLog日志
配置nlog 1.从nuget中获取配置 安装前2个文件 然后会有一个NLog.config 更改内容 <?xml version="1.0" encoding=" ...
- rabbitMq 学习笔记(一)
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题 实现高性能,高可用,可伸缩和最终一致性架构. RabbitMQ 是采用 Erlang 语言实现 AMQP (Adva ...
- ES6迭代器
说起迭代器, 那就要先了解迭代模式 迭代模式: 提供一种方法可以顺序获得聚合对象中的各个元素, 是一种最简单, 也是最常见的设计模式,它可以让用户通过特定的接口寻访集合中的每一个元素 而不用了解底层的 ...
- 如何disabled禁用所有表单input输入框元素
转载地址:https://www.zhangxinxu.com/wordpress/?p=8568 一.pointer-events:none和覆盖层方法的问题 经常会遇到需求,需要禁用div中或者f ...
- Java 之 Properties 集合
一.Properties 概述 Properties 是Hashtable的子类,不允许key和value是null,并且它的key和value的类型都是String. 二.常用方法 1.构造方法 P ...
- 实验吧——认真一点(绕过空格,逗号,关键字过滤等 sql盲注)
题目地址:http://ctf5.shiyanbar.com/web/earnest/index.php 过滤和拦截了某些东西,我经过多次尝试,最终构造的是 1'=(ascii(mid((select ...
- 资深P7架构师详解淘宝服务端高并发分布式架构演进之路
1. 概述 本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则. ...
- OAuth 2.0 的四种授权模式
RFC 6749 OAuth 2.0 的标准是 RFC 6749 文件.该文件先解释了 OAuth 是什么. OAuth 引入了一个授权层,用来分离两种不同的角色:客户端和资源所有者.......资源 ...
- Linux服务管理之ntp
NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议. 在计算机的世界里,时间非常地重要,例如对于火箭发射这种科研活动,对时间的统一性和准确性要 ...