一:定义类并创建实例

Python中定义类,通过class关键字,类名开头大写,参数列表为所继承的父类。如果没有需要明确继承的类,则继承object。

使用类来创建对象,只需 类名+() 形式即可,python中没有new创建对象的。

class Person(object):
pass xiaoming = Person()
xiaohong = Person()

二:动态改变的类属性

Python可以在创建实例后,通过实例来添加属性。而不是直接在类中定义好所有属性,并且同一个类的不同对象,可以在运行期间添加不同的属性。

xiaoming = Person()
xiaoming.name = 'Xiao Ming'
xiaoming.gender = 'Male'
xiaoming.birth = '1990-1-1' //给xiaohong加上的属性不一定要和xiaoming相同:
xiaohong = Person()
xiaohong.name = 'Xiao Hong'
xiaohong.school = 'No. 1 High School'
xiaohong.grade = 2

三:在类中定义所有对象的公有属性(实例属性,不同实例内容不同)

虽然对象可以动态地赋予属性,但是同一类的对象有很多属性是公有的,那么这些属性就可以在类中定义,并且可以通过类的构造函数在创建对象时赋值。

可以为类添加一个特殊的__init__()方法,当创建实例时,__init__()方法被自动调用,我们就在这个方法中定义并赋值公有属性。

需要注意的是:__init__() 方法的第一个参数必须是 self(self相当于this指针),后续参数则可以自由指定,和定义函数没有任何区别。而在创建实例时,只需传递后续参数即可。

class Person(object):
def __init__(self,name,gender,birth,job):
self.name=name
self.gender=gender
self.birth=birth
self.job=job xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')

四:Python中的访问权限

Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。但是,如果一个属性以"__xxx__"的形式定义,那它又可以被外部访问了,以"__xxx__"定义的属性在Python的类中被称为特殊属性。

(其实,python根本没有权限控制,只能靠约定。我们约定 _XX 变量是私有属性,但其实是可以从外部访问的;我们用 __XX 变量实现私有,其实python底层会把该变量转变为  _ClassName_VarName  的变量名。所以我们仍然可以通过 _ClassName_VarName 的形式访问到类中 __XX形式命名的“私有变量”)

五:类属性(不同实例共享同一属性值)

绑定在类上面的属性,被所有实例共享,通过 类名.属性名 访问。

定义类属性很简单,在定义类时,写在方法外即可。

(注意:操作类变量时,要通过 类名.变量名 来操作,不然不起效)

class Person(object):
count=0
def __init__(self,name):
self.name=name
Person.count=Person.count+1//类名.变量名操作类变量

当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问。

六:实例方法

实例的方法就是在类中定义的函数,它的第一个参数永远是 self,指向调用该方法的实例本身,其他参数和一个普通函数是完全一样的。

在实例方法内部,可以访问所有实例属性,这样,如果外部需要访问私有属性,可以通过实例方法调用而获得。

class Person(object):
def __init__(self, name, score)://构造函数
self.name = name
self.score = score
def get_grade(self)://实例函数
return 'A'

七:类方法

类方法被所有实例共用,定义类方法时需要 @classmethod 注解。

@classmethod修饰的方法将绑定到类上,而非类的实例。类方法的第一个参数将传入类本身,通常将参数名命名为 cls。

    @classmethod
def how_many(cls)://cls相当与类本身
return cls.__count //所以这里相当于 ClassName.属性

(这里区分一下函数与方法:函数是一个代码块,可以在代码中通过  函数名()  的形式调用;

方法也是一个函数,但方法是存在与一个类中的。所以我们称呼类中定义的函数为方法,称呼类外定义的为函数。)

(在Python中,方法也是类的属性之一。所以可以通过  className.方法名  访问这个方法,或把它赋值给某变量func;调用方法则加()即可,如:func()则调用了所赋值的类中的对应方法。)

八:继承

注意两点:一:定义类时,在 类名(继承类列表) 括号中指明继承的父类(继承的父类用 , 分隔)

二:在子类的构造函数中,通过   super(子类名, self).__init__(父类构造函数参数列表) 初始化父类;

class Person(object)://定义父类
def __init__(self, name, gender)://父类构造函数
self.name = name
self.gender = gender class Teacher(Person)://继承父类
def __init__(self, name, gender, course)://子类构造函数
super(Teacher,self).__init__(name,gender)//初始化父类
self.course=course//子类新增的属性

子类中调用父类方法的两种方式:

方法一:
super(子类名,self).父类方法名(args) 方法二:
父类名.方法名(args)

九:类型判断

函数 isinstance(实例,类型) 可以判断一个变量是否属于某个类型。

十:动态语言的多态

在调用类中方法时,实例变量优先从自己所属类型寻找函数,找不到则往继承链上寻找,主要找到就调用。

这是动态语言和静态语言(例如Java)最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存在,参数正确,就可以调用

十一:动态获取对象的详细信息

isinstance(obj,class) 判断它是否是某种类型

type(obj) 函数获取变量的类型

dir(obj) 函数获取变量的所有属性

要获取或者设置对象的具体属性,就需要用 getattr() 和 setattr( )函数

十二:特殊方法(magic method)【前后有两下划线的方法】

python中的类自带了一些特殊方法,如:__str__()/__len__()等。

创建一个Python对象时,实际上进行了两步操作:首先是调用了类中的__new__(cls)方法新建对象,然后调用__init__(args)方法为对象初始化赋值。

__del__()方法是析构方法,用于回收Python对象时调用。

在某些操作,如打印、排序等时,会自动调用默认的特殊方法。如果我们想按自己的思路来实现这些功能,则可以在定义类时,重写这些特殊方法。

常见需要重写的方法有:

__str__():定义该类的对象如何以字符串形式输出

__cmp__():定义该类对象的比较方法,用于排序方法时调用。__cmp__用实例自身self和传入的实例 s 进行比较,如果 self 应该排在前面,就返回 -1,如果 s 应该排在前面,就返回1,如果两者相当,返回 0。

__slots__(str,str...):定义了该类可以拥有的属性,目的是限制当前类所能拥有的属性,禁止实例动态添加属性。

__call__(参数):call方法可以把类定义为一个可调用对象,直接通过 类名(参数) 即可调用类中定义的call方法。

运算符重载:

比较运算类魔术方法:

四则运算魔术方法:

逻辑运算魔术方法:

在定义好上面的几种运算符魔术方法后,在代码中,对类实例对象的 +-*/,&&,||,==,>,<等符号运算就会自动调用类中重载过的相应魔术方法

类的展现方法重载:

repr方法是把对象转为机器码字符串,str方法是转为给人看的字符串。

重写dir方法可以选择性地打印类中的属性,某些重要的属性可以不显示出来。

重写类的属性操作方法:

设置对象属性:__setattr__(self,name,value):注意方法中不能调用自身。

查询对象属性:__getattr__(self,name)

__getattribute__(self,name):重写这个方法的话,最终还是要调用父类的 super(Subclass,self).__getattribute__()来查询属性,否则会递归栈溢出。

删除对象属性:__delattr__(self,name):

Python学习笔记四:面向对象编程的更多相关文章

  1. python学习笔记(七):面向对象编程、类

    一.面向对象编程 面向对象--Object Oriented Programming,简称oop,是一种程序设计思想.在说面向对象之前,先说一下什么是编程范式,编程范式你按照什么方式来去编程,去实现一 ...

  2. python 学习笔记7 面向对象编程

    一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...

  3. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  4. python学习笔记1 -- 面向对象编程高级编程1

    说起高级其实也就是些基础的东西,但是活用和熟用肯定会大幅度提升代码质量 首先要记录的是面向对象的灵活性,及如何去控制其灵活性,她允许你在实例中新增属性和方法,允许你给类新增属性和方法,也支持在定义类时 ...

  5. python学习笔记1 -- 面向对象编程类和实例

    由于之前有一定基础,所以python中的类的概接受的比较快,与其他语言一样, python也是通过类来进行事务的抽象,一切皆对象,要不然怎么说程序员不缺对象呢. 言归正传,python中类的声明是cl ...

  6. python自动化测试学习笔记-7面向对象编程,类,继承,实例变量,邮件

    面向对象编程(OOP)术语: class TestClass(object):   val1 = 100       def __init__(self):     self.val2 = 200   ...

  7. python学习笔记_week6_面向对象

    面向对象 介绍(特性(class.object--->封装.继承,多态)).--->世界万物,皆可分类:世界万物,皆可对象 只要是对象,就肯定属于某种品类:只要是对象,就肯定有属性 你是上 ...

  8. javascript 学习笔记之面向对象编程(一):类的实现

    ~~想是一回事,做是一回事,写出来又是一回事~~一直以来,从事C++更多的是VC++多一些,从面向过程到面向对象的转变,让我对OO的编程思想有些偏爱,将一个客观存在的规律抽象出来总是让人比较兴奋,通过 ...

  9. C++ Primer 学习笔记_69_面向对象编程 --继承情况下的类作用域

    面向对象编程 --继承情况下的类作用域 引言: 在继承情况下,派生类的作用域嵌套在基类作用域中:假设不能在派生类作用域中确定名字,就在外围基类作用域中查找该名字的定义. 正是这样的类作用域的层次嵌套使 ...

  10. python学习笔记(6)--面向对象学习

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.   引言 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做(人狗大战)的游戏,你就思 ...

随机推荐

  1. 同志亦凡人第一季/全集BQueer As Folk 1迅雷下载

    同志亦凡人 第一季 Queer as Folk Season 1 (2000) 本季看点:本剧叙述一群同志男女在美国匹兹堡的生活,剧情重心由原来三位男主角Brian,Michael,Justin之间的 ...

  2. Lua date format

    网上有比较复杂的方法:Date Formatting Functions   写了一个非常简单的代码 1: function formatDate(seconds, dateformat) 2: -- ...

  3. java 模拟发送post请求测试

    方法一: HttpClient public void postTest(HttpServletRequest request,Integer type,String phone,String pas ...

  4. [Web 前端 ] 五大WEB主流浏览器及四大内核

    现在国内常见的浏览器有:IE.Firefox.Safari.Opera.Google Chome.QQ浏览器.搜狗浏览器.百度浏览器.猎豹浏览器.UC浏览器.360浏览器.遨游浏览器.世界之窗浏览器等 ...

  5. Understanding Linux CPU stats

    Your Linux server is running slow, so you follow standard procedure and run top. You see the CPU met ...

  6. OpenGL教程(25) skybox

    原帖地址:http://ogldev.atspace.co.uk/www/tutorial25/tutorial25.html Background A skybox is a technique t ...

  7. 什么是Platform Services Controller

    Platform Services Controller (PSC) is a component of the VMware Cloud Infrastructure Suite. PSC deal ...

  8. Redis学习手册(主从复制)(转)

    一.Redis的Replication: 这里首先需要说明的是,在Redis中配置Master-Slave模式真是太简单了.相信在阅读完这篇Blog之后你也可以轻松做到.这里我们还是先列出一些理论性的 ...

  9. Java怎么转义&#1234;这种字符

    import org.apache.commons.lang.StringEscapeUtils; public class EscapeHtml { /** * @param args */ pub ...

  10. 【Spark】Spark Streaming + Kafka direct 的 offset 存入Zookeeper并重用

    Spark Streaming + Kafka direct 的 offset 存入Zookeeper并重用 streaming offset设置_百度搜索 将 Spark Streaming + K ...