类
在Python中使用class
关键字来定义一个类,通常类是用来描述具有相同属性和方法的对象的集合。
面向对象的中重要的概念就是类和实例, 类是抽象的模板, 实例是根据类创建出来的一个一个具体的对象。
声明一个类模板
class Women:
name = '张三'
gender = '女'
height = '168'
def makeMoney(self):
print('可以赚钱!')
def cooking(self):
print('做饭')
class后面紧跟的是类名(Women),类名通常是大写字母开头(也可以使用小写字母开头,保持良好的编程习惯请使用大写)
定义好类, 就可以根据类创建类的实例,例如:zs = Women()
。创建类的实例是通过对象名=类名()
实现的。
类的实例化
lisi = Woman() # 将Women类实例化成对象
print(Woman) # 打印类
print(lisi) # 打印类的实例化对象<__main__.Women object at 0x0..>
类的属性和方法的使用
类里面的变量也称之为属性, 类里面的函数也称之为方法。
lisi.属性名 # 调用属性
lisi.方法名() # 调用方法
给类的实例绑定属性
可以很容易的给实例变量绑定一个新属性, 例如:给lisi绑定一个weight属性。
lisi.weight = '85斤'
print(lisi.weight) # 85斤
对象属性和类属性
使用对象创建的属性称之为对象属性,对象属性只有当前对象里才存在。在Python中对象的属性包含对象的所有内容:方法和数据(方法也是对象的属性)
实例:
# 创建对象属性的方法
class A:
pass
a = A()
a.name = 'xxx' # 创建对象属性,一般通过 【对象名.属性名=xx】 创建
# 在方法里面创建的属性也为对象属性
class A:
def createVal(self):
self.name = 'xx'
a = A()
a.createVal() # 调用方法,创建了对象属性
# 创建类属性的方法
A.name = 'xx' # 通过【类名.属性名=xx】 创建类属性
注意:
如果使用对象属性创建了一个和类属性同名的属性,会优先使用对象使用。
使用类里的方法的参数self(后面会说)创建的属性也为对象属性。
在对象中使用
对象名.属性名
来修改类属性
的时候,其实是创建了一个同名的对象属性。当将对象里面同名的属性删除掉以后,还是会调用类的属性(当对象属性存在的时候找对象属性,对象属性不存在找类属性,类属性不存在报错)。
不能在对象里删除类属性(也不能修改, 见3), 只有使用的权利。
使用类操作过的属性(修改), 所有对象在调用类属性的时候,都是修改后的属性。
类属性属于类本身, 可以通过类名进行修改和删除。
类的常用的属性:
1. __doc__ 类的说明
2. __name__ 返回类名
3. __base__ 返回一个父类
4. __bases__ 返回多个父类(所有父类组成的元组)
5. __dict__ 以字典的形式返回对象或者类的信息(属性组成的字典)
方法
在python中有三种方法:实例方法,静态方法和类方法。
实例方法: 在每次定义实例方法的时候都必须指定实例(第一个参数, 名字一般为self)。例如:有一个对象zs = Women()
, 该对象有一个实例方法makeMoney(self)
, 在调用的时候可以用zs.makeMoney()
或者也可以使用Women.makeMoney(zs)
, 必须要给方法传递一个实例。
静态方法:不需要指定self参数, 可以使用类调用,也可以使用类的实例化对象来调用。之所以要使用此方法, 是因为有时候需要将一组逻辑相关的函数放在一个类里面。可以通过使用@staticmethod
语法糖来声明为静态方法。
类方法: 在每次使用定义类方法的时候都必须指定一个类(第一个参数, 名字一般为cls),可以使用类名来调用,也可以使用实例对象来调用。可以通过使用@classmethod
语法糖将方法声明为类方法。
实例:
class Women:
def makeMoney(self): # 普通方法
pass
@staticmethod
def sleep(): # 静态方法
pass
@classmethod
def play(cls): # 类方法
pass
(1) 给对象绑定方法
使用from types import MethodType
实例:
from types import MethodType
class A:
pass
def func(self): # 类外的函数
print('xxxxx')
a = A()
a.func = MethodType(func, a) # 将方法绑定到类的对象
a.func() # 调用方法
(2) 给类绑定方法
def func(self):
print('func')
# 类名.属性名 = 函数名
A.func = func
A.func() # 调用类方法
注意:
1.给对象绑定的属性或方法, 只有当前对象有。
2.给类绑定的属性或者方法,所有当前类的实例化对象都会拥有。
(3) self的说明
普通方法里面的self其实是代码当前类的实例化后的对象
self只是一个变量名,可以写成其他的名字, 但必须作为第一个参数, 养成良好的变成习惯请使用self。
实例:
class A:
name = ""
def demo(self):
print(self) # <__main__.A object at ox...>
print(id(self)) # 获取对象的内存地址 894654309712
a = A()
print(a) # <__main__.a object at ox...>
print(id(a)) # 894654309712
(4) return-方法的返回值
和函数一样, 代码遇到return
下面的代码就不在执行, 会将值返回给函数的调用处。
如果一个方法没有写return
,该方法的返回值为None
实例:
class Demo:
name = ''
def speak(self):
print('我是{}号类'.format(self.name))
def myReturn(self):
return self.name
# print(‘xx’) # 将不再执行
d = Demo()
d.name = 'd1'
d.speak() # 我是d1号类
print(d.speak()) # 返回None
dName = d.myReturn()
print(dName ) # 打印 d1
(5) 类的构造方法
在Python中, __init__()
为类的构造方法, 用来初始化新创建对象的状态,在一个对象创建以后会立即调用。
实例
class Test(object):
"""
用于初始化类
"""
def __init__(self, a, b): # 当实例化一个对象时候,会自动调用方法,对类进行初始化
self.a = a
self.b = b
def speak(self):
return (self.a, self.b)
t = Test(10, 20)
print(t.speak()) # 10, 20