类的对象
class Student:
def __init__(self, name):
self.name = name
a = Student('a')
b = Student('b')
c = Student('c')
d = Student('d')
实例属性:
对象.属性 = xxxx
只能用对象调用,不能用类调用
类对象
类可以实例化对象,但是类本身也是对象,在类定义的时候被创建出来并且只能有一个类属性和实例方法
定义在类里面, 方法的外面 ,最好用类调用 对象调用只能获取不能修改
class Student:
num = 0
def __init__(self, name):
self.name = name
Student.num += 1
# self.num 先去对象里找有没有 如果没有去类里找
self.num += 1
a = Student('a')
b = Student('b')
c = Student('c')
d = Student('d')
# 调用类属性
print(Student.num)
# 类 实例
print(a.num) # 1 2
print(b.num) # 2 3
print(c.num) # 3 4
print(d.num) # 4 5
# 实例属性用对象调用
# 类属性用类调用
实例方法
类里面定义的方法 参1是self可以用对象调用
类方法
@classmethod 参1是cls 用类调用 也可以用对象调用
静态方法
@staticmethod 用类调用 也可以用方法调用
总结:
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls, 那么通过cls引用的必定是类对象的属性和方法;
实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。
静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用
new 魔法方法:
class A(object):
def __init__(self, name):
self.name = name
print('时秒')
print(self.name)
# new方法 在创建对象的时候 会被自动调用 作用是创建一个对象 并且返回 这个方法调用在init之前
def __new__(cls, *args, **kwargs):
# 必须返回一个正确的对象
return object.__new__(cls)
a = A('孙千')
单例:
是一种设计模式 使用单例类来创建实例对象,只有一个实例,这种设计模式叫做单例模式
# 单例 模式
class A(object):
# 类属性
__instance = None
def __init__(self, name):
self.name = name
def __new__(cls, *args, **kwargs):
# 判断如果instance是空的就去创建对象
if not cls.__instance:
cls.__instance = object.__new__(cls)
return cls.__instance
a = A('时秒')
b = A('时秒')
A.instance = None
c = A('时秒')
print(id(a))
print(id(b))
print(id(c))