一、创建类:
类是对某个对象的定义,它包含有关对象动作方式的信息,包括它的名称、方法、属性和事件。类不存在于内存中,因此它本身并不是对象。当程序运行需要引用类的代码时,就会在内存中创建一个类的新实例,即对象。虽然只有一个类,但能以这个类在内存中创建多个相同类型的对象
class Person(object): #类的方法中必须要有一个self参数,但是方法被调用时,不用传递这个参数 def get_name(self): print "my name is: james" def get_age(self): print "my age is : 3、5" def get_hoppy(self): print "My hoppy is :lvyou" boy = Person() boy.get_name() #但是方法被调用时,不用传递这个参数 boy.get_age() #在调用get_age等方法时,boy自动将自己作为一个参数传入方法中,因此我们称它为self boy.get_hoppy()
二、类的封装与多态
封装:即将抽象得到的数据和行为(功能)相结合,形成一个有机整体,也就是将数据和操作数据的源代码进行有机整合,形成类。
其中数据和函数都是类的成员。目的是隐藏对象的属性和实现细节,对外公开接口,在程序中控制属性的读和修改的访问级别。
封装和多态的区别:多态可以让用户对不知道是什么类的对象进行方法调用,而封装则不用关心对象是如何创建的而直接进行使用
class MyClass(object): # 定义一个全局变量 name = 'html' def set_name(self, name): self.name = name def get_name(self): return self.name my = MyClass() my.set_name('kryle') print my.get_name() # 如果将变量存储到全局变量name中时,实例化MyClass之后,全局变量name将会改变 my = MyClass() my.name = 'Tom' print my.get_name() # 对象有自己的状态,对象的状态由它的特性名称来描述,eg:下面she对象的内容不影响my对象的内容 she = MyClass() she.set_name('angel') print she.get_name() print my.get_name()
三、类方法、属性分类与定义:
python类方法和属性分类:
类中方法:公有方法、私有方法、类方法、静态方法
类中属性:私有属性、公有属性、实例属性、局部变量
类中变量变量分为公有变量和私有变量
【python类包含方法】
公有方法:在类中和类外都能调用的方法
私有方法:不能被类外部调用,在方法前面加上“__“双下划线就是私有方法
类方法:被classmethod()函数处理过的函数,能被类所调用,也能被对象所调用(是继承的关系)
静态方法:相当于“全局函数”,可以被类直接调用,可以被所有实例化对象共享,通过staticmethod()定义, 静态方法没有“self”参数。
内置函数:__xxx__ 系统定义名字,前后均有一个“双下划线” 代表python里特殊方法专用的标识,如 __init__() 代表类的构造函数。
三种方法的主要区别在于参数,实例方法被绑定到一个实例,只能通过实例进行调用;但是对于静态方法和类方法,可以通过类名和实例两种方式进行调用
self参数 说明:
用于区分函数和类的方法(必须有一个self),self参数表示执行对象本身
【python类包含属性】
-
私有属性
函数、方法或者属性的名称以两个下划线开始,则为私有类型;
-
公有属性
如果函数、方法或者属性的名称没有以两个下划线开始,则为公有属性;
-
实例属性
以self作为前缀的属性;
-
局部变量
类的方法中定义的变量没有使用self作为前缀声明,则该变量为局部变量;
详细说明:
xxx 公有变量
_xxx "单下划线 " 开始的成员变量叫做保护变量,意思是只有类对象(即类实例)和子类对象自己能访问到这些变量,需通过类提供的接口进行访问;不能用'from module import *'导入
__xxx 类中的私有变量(Python的函数也是对象,所以成员方法称为成员变量也行得通。)," 双下划线 " 开始的是私有成员,意思是只有类对象自己能访问,连子类对象也不能访问到这个数据,但可以通过私有属性,可以通过instance._classname_attribute方式访问
tip:python中有点伪私有属性的意思
四、区别
classmethod 是类方法,而 staticmethod 是静态方法。
在 Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:
@classmethod 是一个函数修饰符,它表示接下来的是一个类方法,类方法的第一个参数 cls,而实例方法的第一个参数是 self,表示该类的一个实例。
普通对象方法至少需要一个 self 参数,代表类对象实例,类方法有类变量 cls 传入,从而可以用 cls 做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量 cls 是子类,而非父类。
对于类方法,可以通过类来调用,比如说 A 是一个类,那么我们可以通过 A.method() 来调用 A 里面的 method 方法, 也可以通过类的一个实例来调用,如 A().method() 进行调用,首先 A() 方法会调用 A 的初始化方法进行实例化出一个 A 的对象,然后通过该对象调用 method 方法。
五、
六、实例
类方法区分:
# -*-coding:utf-8-*-
class People(object):
color = "yellow" #全局公有变量
default_name = 'anyone'
__age = 30 # 私有属性
#python中内中构造函数
def __init__(self):
self.name ='someone'
#python中S实例函数
def think(self):
self.color = "black"
print("I am a %s" % self.color)
print(self.__age)
def __talk(self):
print("I am talking with Tom")
# def test(self):
# print self.color
@classmethod # 装饰器,只对下面的一个函数起作用
def class_method(cls, message): # 类方法
print("执行类方法 class_method(%s,%s)" % (cls, message))
# print People.color #访问类里面其它成员
@staticmethod # 装饰器,只对下面的一个函数起作用
def static_method(): # 类静态方法
print("我是被定义的静态方法")
ren = People()
print(ren)
print(ren.color)
ren.think()
print(ren._People__age)
# 私有属性调用方法,建议:仅程序测试使用
部分引用来自:https://blog.csdn.net/wohu1104/article/details/89424370(比较不错)