一.类的定义--class关键字

1. 类是用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。使用class语句来创建一个新类,class之后为类的名称(User)并以冒号结尾,类的组成包括成员变量(name,age)和成员函数(who),如下实例:class User:

name='zhzhgo'

age=25

def who(self):

print "I'm "+self.name

2.类属性与方法

①类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。在类内部的方法中使用时:self.__private_attrs。

②类的方法

在类地内部,使用def关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数self,且为第一个参数,如:who(self)。

③类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用时: self.__private_methods。

注意:Python不允许实例化的类访问私有数据,但可以使用 object._className__attrName 访问属性(下面代码最后两行):class MyCounter:

__secretCount = 0  # 私有变量

publicCount = 0    # 公开变量

def count(self):

self.__secretCount += 1

self.publicCount += 1

print self.__secretCount

n = MyCounter()

n.count()

print n.publicCount

#print n.__secretCount  # 报错,实例不能访问私有变量

print n._MyCounter__secretCount

3. 构造方法和析构方法

__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法。

__del__()被称为类的析构函数,__del__在对象消逝的时候被调用,当对象不再被使用时,__del__方法运行。class User(object):

"用户类"

count=0

def __init__(self,name,age): #构造函数

self.name=name

self.age=age

User.count+=1

def who(self):

print "My name is "+self.name+",I'm "+str(self.age)+" years old."

def __del__(self): #析构函数

class_name = self.__class__.__name__

print class_name, "destroyed"

4. 创建实例对象

要创建一个类的实例,你可以使用类的名称,并通过__init__方法接受参数,可以使用点(.)来访问对象的属性,类的帮助信息可以通过ClassName.__doc__查看。u1=User('zhzhgo',25) #创建实例对象u1

u2=User('zz',18) #创建实例对象u2

u1.who() #访问类方法

u2.who()

print "Total Object:"+str(User.count)

print User.__doc__ #打印帮助信息

>>>

My name is zhzhgo,I'm 25 years old.

My name is zz,I'm 18 years old.

Total Object:2

用户类

>>>

5.内置类属性

__doc__ :类的文档字符串

__name__: 类名

__module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)

__bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)

__dict__ : 类的属性(包含一个字典,由类的数据属性组成)print "User.__doc__:", User.__doc__

print "User.__name__:", User.__name__

print "User.__module__:", User.__module__

print "User.__bases__:", User.__bases__

print "User.__dict__:", User.__dict__

>>>

User.__doc__: 用户类

User.__name__: User

User.__module__: __main__

User.__bases__: (,)

User.__dict__: {'count': 0, '__dict__': , '__module__': '__main__', '__del__': , 'who': , '__weakref__': , '__doc__': '\xe7\x94\xa8\xe6\x88\xb7\xe7\xb1\xbb', '__init__': }

>>>

6.对象销毁(垃圾回收)

①同Java语言一样,Python使用了引用计数这一简单技术来追踪内存中的对象。在Python内部记录着所有使用中的对象各有多少引用。一个内部跟踪变量,称为一个引用计数器。当对象被创建时, 就创建了一个引用计数, 当这个对象不再需要时, 也就是说, 这个对象的引用计数变为0 时, 它被垃圾回收。但是回收不是"立即"的, 由解释器在适当的时机,将垃圾对象占用的内存空间回收。

②垃圾回收机制不仅针对引用计数为0的对象,同样也可以处理循环引用的情况。循环引用指的是,两个对象相互引用,但是没有其他变量引用他们。这种情况下,仅使用引用计数是不够的。Python 的垃圾收集器实际上是一个引用计数器和一个循环垃圾收集器。作为引用计数的补充, 垃圾收集器也会留心被分配的总量很大(及未通过引用计数销毁的那些)的对象。 在这种情况下, 解释器会暂停下来, 试图清理所有未引用的循环。

上述实例中如执行:del u1,则u1对象被销毁,打印:User destroyed

二.类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。声明类的时候括号中写要继承的父类。类的继承衍生出类子类,子类可以继承或重写父类的方法,子类可以自定义新的方法或者成员变量,比如学生类可以继承用户类。class User(object):

"用户类"

def __init__(self,name,age): #构造函数

self.name=name

self.age=age

def who(self):

print "My name is "+self.name+",I'm "+str(self.age)+" years old."

class Student(User):

"学生类继承用户类"

def __init__(self,name,age,height):

User.__init__(self,name,age)

self.height=height

def who(self):

User.who(self)

#super(Student,self).who()

print "My height is "+ str(self.height)

Student("zhzhgo",25,168).who()

>>>

My name is zhzhgo,I'm 25 years old.

My height is 168

>>>

在python中继承的特点:

1. 在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

2. 在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数。

3. Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

4. 如果父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索,即方法在子类中未找到时,从左到右查找父类中是否包含该方法。如果在继承元组中列了一个以上的类,那么它就被称作"多重继承" (继承嵌套)class 类名(父类1,父类2,....,父类n)

三.实例方法、类方法、静态方法

实例方法,类方法,静态方法都可以通过实例或者类调用,只不过实例方法通过类调用时需要传递实例的引用(python 3可以传递任意对象,其他版本会报错)

实例方法针对的是实例,第一个参数是self,普通对象方法至少需要一个self参数,代表类对象实例;类方法针对的是类,@classmethod 它表示接下来的是一个类方法,类方法的第一个参数cls,它们都可以继承和重新定义;静态方法用于作为程序中的共享资源,直接通过类去调用,不用实例化对象,不需要self参数,可以认为是全局函数,@staticmethod 它表示接下来的是一个静态方法class Test1(object):

def test1(self): #定义了实例方法

print("object")

@classmethod

def test2(cls): #定义了类方法

print("class")

@staticmethod

def test3(): #定义了静态方法

print("static")

f1=Test1()

#f1.test1(); #通过实例调用

Test1.test1(f1) #直接通过类的方式调用,但是需要自己传递实例引用

Test1.test2()

print "--------------------"

#如果Test1有子类,并且子类覆盖了这个类方法,最终会调用子类的方法并传递子类的类对象

class Test2(Test1):

@classmethod

def test2(cls):

print(cls)

print("test2 object")

f2=Test2()

f2.test2()

print "--------------------"

f1.test3(); #使用实例调用

Test1.test3(); #直接静态方式调用

>>>

object

class

--------------------

test2 object

--------------------

static

static

>>>

python类介绍_python类介绍相关推荐

  1. python类介绍_Python基础介绍 | Class类

    自从改用Python做数据挖掘以来,我就很少用面向对象的内容了,那啥是面向对象呢? 可以这么理解,如果我们能把代码组合成一个一个可以重复使用的类别,那么这能使程序的可复用性更高,以后只要用这个类别的东 ...

  2. python类变量继承_python 类的成员及继承

    1. @staticmethod 静态方法 静态方法不能访问实例变量和类变量,除了身处类里面,所以只能通过类调用以外,它其实和类没有什么关系.如果想要用它访问实例变量或类变量,需要把实例和类传递给函数 ...

  3. python 类组合_python类与对象的组合与继承

    1.把类的对象实例化放到一个新的类里面叫做类的组合,组合就是指几个横向关系的类放在一起,纵向关系的类放在一起是继承,根据实际应用场景确定.简单的说,组合用于"有一个"的场景中,继承 ...

  4. python中扑克牌类设计_Python类的基础设计、使用

    类是事物功能和属性的抽象,对象是类的实例化.就像人人都知道小汽车可以干什么什么的,但光想小汽车如何好是没有用的,得开车或坐才能感受到小汽车的好.人脑里的小汽车是抽象的,即类,而坐上的某辆车是小汽车的实 ...

  5. python类方法继承_python类的继承

    一.概述 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承 ...

  6. python内容限制_Python --类,实例和访问限制

    与其他编程语言相比,Python的类机制添加了至少具有新语法和语义的类.它是C ++和Modula-3中发现的类机制的混合体. Python类提供面向对象编程的所有标准功能:类继承机制允许多个基类,派 ...

  7. python 类 实例_Python类的实例详解

    类(class)是一个用户自定义类型,开发者可以将其实例化以获得实例(instance),实例表示这种类型的对象.在Python中,类就是对象,开发者可以像对其他对象那样处理函数,可以在调用函数时传递 ...

  8. python什么时候用类设计_Python 类的设计与 Java 类的设计有何区别?

    读前声明:本文主要参考了Real Python中的内容,提炼了一些主要的内容,如果英文还不错的想详细了解的话建议直接进入该网站阅读. 提到类的设计,我们不得不提及面向对象(OOP),它是一种编程思想, ...

  9. python保留字_开始了类定义_Python 类的定 义

    Python 是完全面向对象的:你可以定义自已的类,从自已的或内置的类继承,然后从你定义的类创建实例. 在 Python 中定义类很简单.就像定义函数,没有单独的接口定义.只要定义类,然后就可以开始编 ...

最新文章

  1. [SLAM] a bite of SLAM
  2. 2014\Province_C_C++_B\7 六角填数
  3. sql where子查询5中字句的使用顺序
  4. 如何监控和提高IIS的性能
  5. Android--使用XMLPull解析xml
  6. 利用泛型和反射,将从数据库select出来的集合直接转换成对象
  7. 通过代码生成机制实现强类型编程-CodeSimth版
  8. 计算机桌面底部不显示了,为什么电脑底部不会显示出来怎么办
  9. Kubernetes知识体系-从入门到精通
  10. 自定义self.editButtonItem 改变自定义self.editButtonItem的背景图片
  11. 【加密工具】2019年网络安全加密工具排行,好用的计算机加密软件推荐
  12. Python实现类似局域网QQ群聊
  13. cropper使用说明
  14. 金蝶KIS商贸高级版V6.1开发实现‘序时簿中心’增加'联系人'字段列
  15. J-link 报错解决方法
  16. Unity3D接入移动MM支付SDK(强联网)的问题
  17. excel公式编辑器_用EXCEL图表制作时钟「内容详细,配有大量动画操作,值得收藏」
  18. 国外打工人分享如何如何通过销售excel电子表格赚到 28 万美元
  19. 基于51单片机的故障灯检测
  20. 安卓修改服务器数据库,安卓端使用服务器端数据库

热门文章

  1. [leetcode] 230. Kth Smallest Element in a BST 找出二叉搜索树中的第k小的元素
  2. Java使用MyEclipse2017时的一些小细节
  3. 操作系统内核(linux)
  4. ArcGIS API for Silverlight 实现修改地图上的工程点位置
  5. TableCellRenderer TableCellEditor(三)
  6. Add Binary - LeetCode
  7. 怎样修改SSIS包中 Connection Manager 中的参数
  8. linux中select()函数分析
  9. Xshell 连接报错解决:WARNING! The remote SSH server rejected X11 forwarding request.
  10. 用996打败员工,用“奋斗”替代生活