类属性
实例属性:又称对象属性,所属于具体的实例对象,不同实例对象之间的实例属性互不影响
- 所属于类对象,多个实例对象之间共享同一个类属性
- 获取类属性方法:类名.类属性
- 通过实例对象不能够修改类属性
类属性可以理解成一个共享的全局变量。
'''
类属性
'''
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))