类属性和实例属性
定义:
实例属性:在实例对象中定义的属性
类属性: 在类对象中定义的属性,并且多个实例对象共享一份类属性
类属性使用方式:类名.类属性,也可以使用 对象.类属性
注意:
1.不可变类型:对象名。属性名=属性值 是给对象添加属性,而不是进行修改
2. 可变类型:如果对象是修改可变数据类型变量中的数据,是真正的修改如果是重新给可变数据类型变量赋值,这是给该对象添加属性
classDog:passdog=Dog
dog.name= '旺财'
print(dog.name)
dog.name= '大黄'
print(dog.name)classCourse:
language= "Chinese"course= ['Python']defmoney(self):print('败家')print(id(Course))#类属性可以通过类对象和实例对象调用
print(Course.language,Course.course) #类名.类属性
python=Course()print(python.course,python.language) #对象名.类属性
#添加实例属性
python.time= 20
print(python.time)#print(Course.time) #实例属性只能通过实例对象进行调用,不可以通过类对象调用
不可变类型:对象名.属性名=属性值 是给对象添加属性值,而不是进行修改
修改类属性,可以通过类对象修改
print(Course.language) #Chinese
Course.language = "python"
print(Course.language)
python=Course()
python.language= 'I love python' #是给对象添加属性,而不是进行修改
print(python.language)print(Course.language)
可变类型:如果对象是修改可变数据类型变量中的数据,是真正的修改
如果是重新给可变数据类型变量赋值,这是给该对象添加属性
print(Course.course)#修改可变类型的类属性 类对象.属性名
Course.course.append('java')print(Course.course)
python=Course()
python.course.append('C')print(python.course,Course.course)
python.course= ['python','C++'] #给该对象添加属性
print(python.course) #['python', 'C++']
print(Course.course) #类属性并没有修改['Python', 'java', 'C']
python.money()
Course.money(Course)
类可以调用实例方法、静态方法、类方法和类属性,但是不能调用实例属性
实例对象可以调用实例方法、类方法、静态方法、类属性和实例属性
实例对象能调用所有的方法和属性
而类除了不能调用实例属性,其他方法和属性都能够调用
classClassname:
@staticmethoddeffun():print('静态方法')
@classmethoddefa(cls):print('类方法')#普通方法
defb(self):print('普通方法')
Classname.fun()
Classname.a()#Classname.b()
C=Classname()
C.fun()
C.a()
C.b()
静态方法
Python 中允许定义与”类对象“无关的方法,称为”静态方法“
静态方法和模块中定义普通函数没有区别,只不过静态方法放到了类的名字空间里面,需要通过类调用
静态方法通过装饰器@staticmethod 来定义。格式
@staticmethod
def 静态方法名([形参列表])
函数体
要点如下:
1.@staticmethod必须位于方法上面的一行
2.调用静态方法格式:类名.静态方法名(参数列表)
3.静态方法中访问实例属性和实例方法会导致错误
classStudent:
company= 'SXT'@staticmethoddefadd(a,b):print('{0}+{1}={2}'.format(a,b,(a+b)))return a+b
Student.add(20,30)
a=Student()
a.add(1,2)__metaclass__ =typeclassTst:
name= 'tst'data= 'this is data'
#普通方法
defnormalMethod(self, name):print(self.data, name)#类方法,可以访问类属性
@classmethoddefclassMethod(cls, name):print(cls.data, name)#静态方法,不可以访问类属性
@staticmethoddefstaticMethod(name):print(name)
tst=Tst()
tst.data= 'this is new'tst.normalMethod('name')
tst.staticMethod('name')
tst.classMethod('name')print('------------------------------------')#error普通方法必须通过实例调用#Tst.normalMethod('name')
Tst.classMethod('name')
Tst.staticMethod('name')
普通方法、类方法和静态方法区别
普通方法
1.普通方法可以访问实例属性和类属性
2.普通方法不可以通过类对象调用
类方法
1.类方法可以访问类属性,不能访问实例属性
2.类方法可以通过类对象调用
静态方法
1.静态方法不可以访问类属性,不可以访问实例属性
2.静态方法可以通过类对象调用