Python基础之类

类属性

实例属性:又称对象属性,所属于具体的实例对象,不同实例对象之间的实例属性互不影响

  • 所属于类对象,多个实例对象之间共享同一个类属性
  • 获取类属性方法:类名.类属性
  • 通过实例对象不能够修改类属性

类属性可以理解成一个共享的全局变量。

'''
类属性
'''
class Person:
    #类属性
    sum_num = 0
    def __init__(self,new_name):
        #实例属性
        self.name = new_name
        #修改类属性值,每创建以个实例对象,类属性值加1
        Person.sum_num += 1

p1 = Person("zhangsan")
print(p1.sum_num,Person.sum_num)
p2 = Person("lisi")
#通过实例对象不能够修改类属性值,如果修改的属性在实例中不存在,则动态添加实例属性
p1.sum_num = 100
print(p1.sum_num,p2.sum_num,Person.sum_num)

通过实例对象获取属性,若实例属性与类属性同名,实例属性优先于类属性

类方法

  • 所属于类对象,使用@classmethod修饰的方法
  • 定义类方法的第一参数通常以“cls”参数作为类对象被传入
  • 调用方式:类名.类方法 或者 实例对象.类方法(不推荐)
class Person:
    #类属性
    sum_num = 0
    def __init__(self,new_name):
        #实例属性
        self.name = new_name
        #定义一个与类属性同名的实例属性
        self.sum_num = new_num

    #类方法
    @classmethod
    def add_sum_num(cls):
        cls.sum_num += 1

        print(cls.sum_num)

#方法1:类名.类方法
Person.add_sum_num()
print("------------------------")
#方法2:实例对象.类方法
p = Person("zhangsan")
p.add_sum_num()

静态方法

  • 使用@staticmethod修饰的方法,不需要默认传递任何参数
  • 调用方式:类名.静态方法 或者 实例对象.静态方法
class Person:
    #类属性
    sum_num = 0
    def __init__(self,new_name):
        #实例属性
        self.name = new_name
        #定义一个与类属性同名的实例属性
        self.sum_num = new_num

    #类方法
    @classmethod
    def add_sum_num(cls):
        cls.sum_num += 1

        print(cls.sum_num)

    #静态方法
    @staticmethod
    def static_test():
        print("------静态方法------")
        Person.sum_num += 1
        print(Person.sum_num)

#静态方法调用
Person.static_test()
print("------------------------")
p = Person("zhangsan")
p.static_test()

总结:在类方法和静态方法中不能直接调用实例属性
(对象、实例、方法、类之间的关系)

单例类

_new_(cls)

  • 超类object类内置的方法,用户创建对象,返回创建对象的引用
  • 必须要提供cls参数,代表类对象
  • 必须要有返回值,返回创建对象的引用

单例类:在整个程序系统中确保某一个类只有一个实例对象

'''
单例类
'''
class DataBaseObj(object):
    def __init__(self,new_name):#对象初始化
        print("---init构造方法----")
        self.name = new_name
        print(self.name)

    def __new__(cls,name):#创建对象
        print("cls_id:",id(cls))
        return object.__new__(cls)#必须有返回值,返回的是创建的对象的引用

print(id(DataBaseObj))
db = DataBaseObj("mysql")
print(db)
#单例类
class SingleInstance:
    __instance = None
    def __init__(self):
        print("-----init-----")
    def __new__(cls):
        if cls.__instance == None:
            cls.__instance = object.__new__(cls)
        return cls.__instance

s1 = SingleInstance()
print(id(s1))
s2 = SingleInstance()
print(id(s2))