博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

面向对象相关

Posted on 2019-01-02 17:30  GraceNana  阅读(110)  评论(0编辑  收藏  举报

面向对象的三大特征

封装 : 把固定功能的代码封装到一个代码块,函数,对象,打包成模块

继承 : 子类可以自动拥有父类中除了私有属性外的其他所有内容

多态 : 同一个对象,多种形态

类的成员 

 变量 : 

1.实例变量(字段) : 给对象用的

2.类变量(静态变量) : 多个对象共享的.最好是用类名来访问

方法 :

1.成员方法(实例方法) : 对象直接访问的方法叫成员方法

2.静态方法 : 不需要给方法传递self

@staticmethod
def func():
    pass

3.类方法 : 类方法被调用时也不需要传递实例对象

@classmethod
def func1(cls, a, b):
    pass

属性:

class Person:
    def __init__(self, name, gender, birth):
        self.name = name
        self.gender = gender
        self.birth = birth  # 2000  2018
    # 年龄 -> 应该是算出来的. 而不是直接存储
    @property # 把一个方法更改成一个属性, 每次拿属性的时候都会自动的去执行这个方法
                   # 方法的返回值就是属性值
    def age(self):  # 实例方法
        print("我是方法")
        return 2018 - self.birth

1. 方法参数只能有一个self

2. 方法上方要写@property

3. 调用的时候,不需要写括号.直接当成属性变量来用就可以了

私有:

使用__作为前缀,那么这个方法或者变量就是一个私有的

私有变量 : self.__age = age  

私有方法 : def __age(self):  pass

类与类之间的关系:

1. 依赖关系

2. 关联关系

3. 组合关系

4. 聚合关系

5. 继承关系 : self就是你访问方法的那个对象,先找自己,再找父类

6. 实现关系

类中的特殊成员

1. 类名()会自动执行__init__()

2. 对象()会自动执行__call__()

3. 对象[key]会自动执行__getitem__()

4. 对象[key] = value 会自动执行__setitem__()

5. del 对象[key]会自动执行__delitem__()

6. 对象+对象会自动执行__add__()

7. with对象as变量会自动执行__enter__和__exit__

8. 打印对象的时候会自动执行__str__

9. 去掉hash __hash__ == None 对象就不可哈希了

 

创建对象的步骤 :  加载类 → 开辟内存(__new__) → 初始化(__init__) → 使用对象调用方法

 

isinstance, type, issubclass函数

issubclass(Bar, Foo) 这个内置函数判断xx类是否是xxx类型的子类

type(obj) 查看obj是由哪个类创建的

isinstance(Foo(), Foo) 判断xxx是xx类型的数据,没有type精准,只能往上判断,是否是XX家族体系中的

 

函数和方法

1. 类方法.不论任何情况,都是方法

2. 静态方法,不论任何情况.都是函数

3. 实例方法,如果是实例访问.就是方法.如果是类名访问就是函数

types模块

from types import MethodType, FunctionType
def func():
    pass
print(isinstance(func, FunctionType))  # True
print(isinstance(func, MethodType))    # False 

1.getattr(obj, str) : 从对象中获取到xxx功能, getattr可以从模块中获取内容,也可以从类中获取,也可以从对象中获取

2.hasattr(obj,str) : 判断xxx中包含了xx功能

3.setattr(obj, str, value)把obj中的str成员设置成value.value可以是值,也可以是函数或者方法

4.delattr(obj, str)把obj中的str成员删除掉

以上方法都是内存中进行的,并不会影响源代码

 

约束

1.提取一个父类,再父类中给出一个方法,并在方法中不给出任何代码.直接抛出异常

class Base:
    def login(self):
        raise Exception('未实现login()')

class Student(Base):
    def login(self): #如果子类找不到对应的方法,父类则会报错
        pass

2.写抽象类和抽象方法 

from abc import ABCMeta, abstratmethod

class Base(metaclass = ABCMeta):
    @abstractmethod
    def login(self):
        pass
class Normal(Base):
    def login(self):
        pass