(八) 学习笔记:python面向对象

在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】 创建类属性

注意:

  1. 如果使用对象属性创建了一个和类属性同名的属性,会优先使用对象使用。

  2. 使用类里的方法的参数self(后面会说)创建的属性也为对象属性。

  3. 在对象中使用对象名.属性名来修改类属性的时候,其实是创建了一个同名的对象属性。

  4. 当将对象里面同名的属性删除掉以后,还是会调用类的属性(当对象属性存在的时候找对象属性,对象属性不存在找类属性,类属性不存在报错)。

  5. 不能在对象里删除类属性(也不能修改, 见3), 只有使用的权利。

  6. 使用类操作过的属性(修改), 所有对象在调用类属性的时候,都是修改后的属性。

  7. 类属性属于类本身, 可以通过类名进行修改和删除。

类的常用的属性:

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

你可能感兴趣的:((八) 学习笔记:python面向对象)