一 python自动化基础能力:3.python基础上之数据类型,函数(22)


打印
00
修改实例的属性,
class A(object):#类属性count = 0a = A()a.count = 5print('In class,',A.count)print('In instance,',a.count)
打印
In class, 0In instance, 5
修改类中的属性,
class A(object):#类属性count = 0a = A()A.count = 5print('In class,',A.count)print('In instance,',a.count)
打印
In class, 5In instance, 5
可总结出:类属性只能通过类对象来修改,无法通过实例对象来修改;
class A(object):def __init__(self):#实例属性self.name = 'Tom'a = A()print(a.name)
打印Tom
在初始化中定义的属性为实例属性,只能通过实例属性来访问和修改,类对象无法访问和修改 。
如,
class A(object):def __init__(self):#实例属性self.name = 'Tom'a = A()print(A.name)
报错: type'A' has no'name'
在类中定义的以self为第一个参数的方法都是实例方法;
实力方法在调用时,会将调用对象作为self传入;
class A(object):def __init__(self):#实例属性self.name = 'Tom'def test(self):#实例方法print('in test')a = A()a.test()
打印in test
类对象调用时,
class A(object):def __init__(self):#实例属性self.name = 'Tom'def test(self):#实例方法print('in test')a = A()A.test()
报错: test()1: 'self'
但是通过类对象调用时,传入实例对象多为方法的参数不会报错 。
即通过类对象调用方法时,不会自动穿self,必须手动传self 。
class A(object):def __init__(self):#实例属性self.name = 'Tom'def test(self):#实例方法print('in test')a = A()A.test(a)
输出结果相同 。
即a.test()等价于A.test(a) 。
可以通过装饰器来调用类方法;
类方法的第一个参数是cls,也会被自动传递,cls就是当前的类对象 。
class A(object):count = 0def __init__(self):#实例属性self.name = 'Tom'def test(self):#实例方法print('in test')@classmethoddef test2(cls):#实例方法print('in test2',cls)a = A()A.test2()
打印in test2
调用类属性,
class A(object):count = 0def __init__(self):#实例属性self.name = 'Tom'def test(self):#实例方法print('in test')@classmethoddef test2(cls):#实例方法print('in test2',cls)print(cls.count)a = A()A.test2()
打印
in test2 0
通过实例调用类方法,
class A(object):count = 0def __init__(self):#实例属性self.name = 'Tom'def test(self):#实例方法print('in test')@classmethoddef test2(cls):#实例方法print('in test2',cls)print(cls.count)a = A()a.test2()
结果相同 。
可总结:类方法可以通过类对象调用,也可通过实例方法调用 。
A.test2()等价于a.test2() 。
静态方法:
用装饰器来调用类方法