python 面向对象编程学习总结
面向对象是个抽象的东西,概念比较多,下面会一一介绍。
一、类和实例
类(Class)和实例(Instance)是面向对象最重要的概念。
类是指抽象出的模板。实例则是根据类创建出来的具体的“对象”,每个对象都拥有从类中继承的相同的方法,但各自的数据可能不同。
class Student(object):
pass kate = Student()
关键字class后面跟着类名,类名通常是大写字母开头的单词,紧接着是(object),表示该类是从哪个类继承下来的。通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承下来的类。
Student 就是类名,kate 就是Student()的实例,类只有实例化以后才能使用。
二、构造函数,析构函数,类变量,实例变量
构造函数:__init__(self,name,age,sex), 这个方法就是构造函数,在实例化的时候自动调用。所有如果这个函数内有打印的方法,当kate实例出来的时候会打印里面的信息。
__init__方法的第一个参数永远都是self,表示创建实例本身,在__init__方法内部,可以把各种属性绑定到self,因为self指向创建的实例本身。
有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器自己会把实例变量传进去。
析构函数:__del__(self), 这个方法就是析构函数,是在实例被销毁时自动调用的。
类变量: country = 'China' , 类变量不需要实例,可以直接使用, 如line 14
实例变量: self.name = name, self.name 这种形式就是实例变量,需要实例化后才能使用, 如 line15就会报错,需要实例化line16的kate, 才能使用name, age, sex
可以自由地给一个实例变量绑定属性,比如,给实例kate绑定一个language属性。
kate.language = '中文'
print(kate.language) #中文
和普通函数相比,在类中定义的函数只有一点不同,就是第一个参数永远是实例变量self,并且,调用时,不用传递该参数。除此之外,类的方法和普通函数没有什么区别。比如school函数只需要传city就可以了。
kate.school('北京') #凯特在北京上学
下面是具体的代码段例子。
class Person(object):
country = 'China' #类变量,不需要实例化,可以直接用
def __init__(self,name,age,sex):#构造函数,实例化的使用自动调用
self.name = name #实例变量,必须实例化之后才能用,也叫成员变量
self.age = age
self.sex =sex
def say_my_country(self):
print(self.country)#类变量可以在类里作为属性使用
def school(self,city):
self.city = city
print('%s在%s上学' %(self.name,self.city))
def __del__(self):#析构函数,实例销毁的时候自动调用
print('实例销毁的时候自动调用')
print(Person.country)#类变量,不需要实例化,可以直接用
#print(Person.name)#实例变量,必须实例化之后才能用,AttributeError: type object 'Person' has no attribute 'name'
kate = Person('凯特',18,'女')
print(kate.name)
print(kate.age)
print(kate.sex)
print(kate.country) #China
kate.say_my_country() #China
kate.language = '中文'
print(kate.language) #中文
kate.school('北京') #凯特在北京上学
三、访问限制
在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样就隐藏了内部的复杂逻辑。
kate = Person('凯特',18,'女')
kate.name = '王菲'
print(kate.name)
如果加这句代码line2,kate.name = '王菲', 这样执行line3就会打印王菲,而不是凯特,name会修改了。
四、私有变量,私有函数,静态方法,类方法
私有变量:self.__host = host ,只能在类里使用,如果执行line31会报错 AttributeError: 'MyRedis' object has no attribute '__host'
私有函数:def __conn_redis(self),只能在类里使用,执行line32会报错 AttributeError: 'MyRedis' object has no attribute '__conn_redis'
静态方法: 需要加 @staticmethod,不需要实例化就能直接用,其实和类没有什么关系,就是一个普通的函数,写在了类里面而已,也用不了self的那些东西,也调用不了类里的其他函数
类方法:需要加 @classmethod,不需要实例化就能直接用,它比静态方法高级一点,它可以使用类变量和类方法, 如函数 class_fun(cls)
import redis
class MyRedis():
hi= '哈哈'
def __init__(self,host,db,password='',port=6379):
self.__host = host # 私有变量,只能在类里使用
self.passwd = password
self.port = port
self.db = db
#self.conn_redis()
self.__conn_redis()
# def conn_redis(self):
# self.conn = redis.Redis(host=self.__host,db=self.db,password=self.passwd,port=self.port)
def __conn_redis(self): #私有函数,只能在类里使用
self.conn = redis.Redis(host=self.__host,db=self.db,password=self.passwd,port=self.port)
def get(self,k):
print('__host...',self.__host)
return self.conn.get(k).decode() @staticmethod #静态方法
def other():
print('我是other')
@classmethod #类方法,也不需要实例化,直接就能用,它比静态方法高级一点,它可以使用类变量和类方法
def class_fun(cls):
print(cls.hi) #可以调用类变量
cls.class_fun2()#可以调用类方法
@classmethod
def class_fun2(cls):
print('类方法2') r = MyRedis('localhost',3)
# print(r.__host) #AttributeError: 'MyRedis' object has no attribute '__host'
#r.__conn_redis() #AttributeError: 'MyRedis' object has no attribute '__conn_redis'
print(r.get('kate11'))
MyRedis.other() #静态方法不需要实例化
MyRedis.class_fun()
五、继承
在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。
比如,我们已经编写了一个名为Animal的class,有一个run()方法可以直接打印一句话,然后新建一个叫Dog的类,继承了Animal类。
所以Dog可以用Animal类里的函数run(), eat(),同时自己也可以定义自己的函数。
@property ,这是个装饰器,把函数变成一个属性方法,如果这个方法没有入参的话,那就可以变成一个属性方法。
在使用的时候可以如下面代码所示的 b.protect, 而不是像其他的方法一样加(), 如 b.bite()
class Animal(object):
def run(self):
print('running...')
def eat(self):
print('eating...') class Dog(Animal):
def run(self):
print('dog is running')
def bite(self):
print('dog will bite people.')
@property
def protect(self):
print('dog will protect people.')
a = Animal()
a.run()
a.eat()
b = Dog()
b.run()
b.eat()
b.bite()
b.protect #属性方法, dog will protect people.
python 面向对象编程学习总结的更多相关文章
- python面向对象编程学习
python面向对象编程 基本概念理解 面向对象编程--Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- Python 面向对象编程 继承 和多态
Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...
- 图解python | 面向对象编程
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/56 本文地址:http://www.showmeai.tech/article-det ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
- Python 面向对象编程——访问限制
<无访问限制的对象> 在Class内部,可以有属性和方法,而外部代码可以通过直接调用实例变量的方法来操作数据,这样,就隐藏了内部的复杂逻辑.但是,从前面Student类的定义来看(见:Py ...
随机推荐
- NHibernate初学六之关联多对多关系
1:创建三张表T_Course.T_Student.T_Middle:其中一个学生可以对应多个课程,一个课程也可以对应多个学生,用T_Middle存放它们的关系内容: CREATE TABLE [db ...
- js正则函数match、exec、test、search、replace、split使用介绍集合,学习正则表达式的朋友可以参考下。
match 方法 使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回. stringObj.match(rgExp) 参数 stringObj 必选项.对其进行查找的 String 对 ...
- CSS美化自己的完美网页
CSS美化自己的完美网页 CSS概述 css样式: css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化,CSS的可以使页面更加的美观.基本上所有的h ...
- java基础---->数字签名算法的介绍
数字签名(又称公钥数字签名)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.关于数字签名的介绍,可以参见百度百科:http://baike.baidu.c ...
- android基础---->AIDL服务的使用
AIDL和其他的IDL类似,它允许你定义程序接口,以便客户端与服务器端通过IPC机制交互.在android上面,一个进程一般不能访问另外进程的内存.因此,Android平台将这些跨进程访问的对象分解成 ...
- LeetCode——Product of Array Except Self
Description: Given an array of n integers where n > 1, nums, return an array output such that out ...
- my sql 两个 索引 时的 union 与 or 的比较
背景:用一个表中的父子级关系进行查询 优化的过程中 发现可以使用 or 来代替 union all union all 需要查询两次 表 而 使用 or只需要 查询 一次 并且 两个字段都建立了索引 ...
- 转载-解决使用httpClient 4.3.x登陆 https时的证书报错问题
今天在使用httpClient4.3.6模拟登陆https网站的时候出现了证书报错的问题,这是在开源中国社区里找到的可行的答案(原文链接:http://www.oschina.net/question ...
- Unity3D笔记十一 定制导航菜单栏
一.定制导航栏 Unity导航菜单栏位于游戏引擎界面的顶部,其中有很多选项且含义各不相同.Unity为开发者提供了导航菜单栏的程序接口,使用代码可以动态添加菜单栏中的选项以及子项 using Unit ...
- ssh-keygen 不是内部或外部命令解决办法!
在使用 git 的远程仓库的时候,生成秘钥的使用,会遇到ssh-keygen不是内部命令也不是外部命令的问题: 具体解决: 第一步:找到:Git/usr/bin目录下的ssh-keygen.exe(一 ...