类属性和实例属性
定义:
实例属性:在实例对象中定义的属性
类属性: 在类对象中定义的属性,并且多个实例对象共享一份类属性
类属性使用方式:类名.类属性,也可以使用 对象.类属性
注意:
1.不可变类型:对象名。属性名=属性值 是给对象添加属性,而不是进行修改
2. 可变类型:如果对象是修改可变数据类型变量中的数据,是真正的修改如果是重新给可变数据类型变量赋值,这是给该对象添加属性
class Dog: pass dog=Dog dog.name = '旺财' print(dog.name) dog.name = '大黄' print(dog.name) class Course: language = "Chinese" course = ['Python'] def money(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)
类可以调用实例方法、静态方法、类方法和类属性,但是不能调用实例属性
实例对象可以调用实例方法、类方法、静态方法、类属性和实例属性
实例对象能调用所有的方法和属性
而类除了不能调用实例属性,其他方法和属性都能够调用
class Classname: @staticmethod def fun(): print('静态方法') @classmethod def a(cls): print('类方法') # 普通方法 def b(self): print('普通方法') Classname.fun() Classname.a() # Classname.b() C = Classname() C.fun() C.a() C.b()
静态方法
Python 中允许定义与”类对象“无关的方法,称为”静态方法“
静态方法和模块中定义普通函数没有区别,只不过静态方法放到了类的名字空间里面,需要通过类调用
静态方法通过装饰器@staticmethod 来定义。格式
@staticmethod
def 静态方法名([形参列表])
函数体
要点如下:
1.@staticmethod必须位于方法上面的一行
2.调用静态方法格式:类名.静态方法名(参数列表)
3.静态方法中访问实例属性和实例方法会导致错误
class Student: company = 'SXT' @staticmethod def add(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__ = type class Tst: name = 'tst' data = 'this is data' # 普通方法 def normalMethod(self, name): print(self.data, name) # 类方法,可以访问类属性 @classmethod def classMethod(cls, name): print(cls.data, name) # 静态方法,不可以访问类属性 @staticmethod def staticMethod(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.静态方法可以通过类对象调用