Python学习03——面向对象

Python3 面向对象

类命名使用大驼峰法则

# 创建类语法
# 类中封装的方法,第一个参数必须是 self
# 那一个对象调用的方法,self 就是哪一个对象的引用
class ClassName:
    def 函数1(self):
        self.成员属性
        ...


    def 函数2(self, param):
        ...
# 创建对象语法
对象变量 = 类名()

对象初始化

class Cat:

    # 初始化方法,类被实例化时自动执行,不需要调用
    def __init__(self, new_name):
        self.name = new_name

    def __del__(self):
        print("对象被销毁")

    def __str__(self):
        return "需要打印出的内容"


    def 函数1(self):
        ...



# 调用类
tom = Cat("Tom") # 这样Tom就自动在__init__中被赋值给name属性

print(tom) # 因为使用了 __str__ 函数定义,所以不会打印出地址信息,打印的是自定义的信息

__del__ 方法

对象被销毁前,会自动调用对象的 __del__ 方法,与初始化 __init__ 方法对应

如果对象被销毁前进行操作,则可以使用此方法

__str__ 方法

把对象地址信息等替换为自定义的信息

此方法必须返回一个字符串

Python身份运算符

python中 None 使用 is 或 is not 身份运算符

私有属性和私有方法

在定义属性或方法时,在属性或方法面前增加2个下划线,定义的就是私有属性或方法了

子类不可访问父类的私有属性方法,但可以通过父类的公有方法间接访问到父类的私有方法和属性

python中没有真正意义上的私有属性和方法,通过:实例化的对象._类名.__私有属性或方法()  就可以调用私有

类的继承有传递性:

class 父类:
    ...


class 子类1(父类):
    ...


# 此情况下子类2拥有父类和子类1所有属性和方法
class 子类2(子类1):
    ...

方法重写:子类中重新定义方法,会覆盖掉当前子类中的父类方法

子类中调用父类方法:super().方法名()

类可以多继承

class A:
    def demo1(self):
        ...


class B:
    def demo2(self):
        ...


class C(A, B):
    pass

多继承要避免方法、属性重名

类属性类方法

类属性调用:类名.属性名;不要用对象名来调用

类方法:

class 类名:
    count = 7;

    def __init__(self):
        ...

    
    # 类方法定义前要写@classmethod,参数要写cls
    @classmethod
    def 类方法名(cls):
        print(cls.count)



# 类方法调用
类名.类方法名()

静态方法

class 类名:

    # 静态方法不使用类方法、属性和实例方法、属性
    # 静态方法定义前要写@staticmethod,参数为空
    @staticmethod
    def 静态方法名():
        print("123")



# 静态方法调用
类名.静态方法名()

__new__()方法

__new__()方法作用:1)为对象在内存中分配空间;2)返回对象的引用

__new__方法(第一个执行)先于__init__方法执行

只有继承于object的新式类才能有__new__方法,__new__方法在创建类实例对象时由Python解释器自动调用,一般不用自己定义,Python默认调用该类的直接父类的__new__方法来构造该类的实例,如果该类的父类也没有重写__new__,那么将一直按此规矩追溯至object的__new__方法,因为object是所有新式类的基类,若需要自定义__new__方法,一般用法如下

class Person(object):
    def __new__(cls):
        instance = super().__new__(cls)
        return instance

__new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由Python解释器自动提供;__new__必须要有返回值,返回实例化出来的实例,可以return父类new出来的实例,或直接是object的new出来的实例;否则对象没有分配内存空间无法实例化

单例设计模式

单例:让类创建的对象,在系统中只有唯一的一个实例

1、定义一个类属性,初始值为 None,用于记录单例对象的引用(内存地址)

2、重写 __new__ 方法

3、如果类属性 is None,调用父类方法分配空间,并在类属性中记录结果

4、返回类属性中记录的对象引用

*一个类被多次调用实例化,如果不使用单例,每次都会实例化,占用内存空间,但每个对象都是一样的;所以使用单例模式,把类的实例化封装成一个方法,如果已经被实例化了就直接调用,没有实例化就先进行实例化,这样每次调用都是同一个实例化的类,节省资源

class CreateCls(object):
    # 记录第一个被创建对象的引用
    instance = None

    def __new__(cls, *args, **kwargs):
        # 1、判断类属性是否为空对象
        if cls.instance is None:
            # 2、调用父类的方法,为第一个对象分配空间
            instance = super().__new__(cls)

        # 返回类属性保存的对象引用
        return cls.instance

初始化方法只调用一次

class ClassName(object):
    # 记录是否执行过初始化动作
    init_flag = False

    def __init__(self):
        # 1、判断是否执行过初始化动作
        if ClassName.init_flag:
            # 初始化属性为真,不需要再初始化操作
            return

        # 2、如果没有执行过,再执行初始化动作
        print("初始化操作")            

        # 3、修改类属性的标记
        ClassName.init_flag = True
发布了97 篇原创文章 · 获赞 21 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/sun124608666/article/details/102611703