属性和方法是面向对象中的叫法,一般是一个类被定义的时候会被用户添加.其中属性有:类属性和对象属性,方法有:类方法 对象方法 静态方法.
1.类属性:直接声明在类中的变量属于类的属性,可以被类直接调用,也可以被实例化的对象调用.
class Person(object):
country = '中国'
def f1(self):
print("这是对象方法")
obj1 = Person()
print(Person.country,obj1.country)
运行结果:
中国 中国
需要注意的是,通过对象调用去修改它的值是不生效的.
class Person(object):
country = '中国'
def f1(self):
print("这是对象方法")
obj1 = Person()
print(Person.country,obj1.country)
print(obj1.__dict__)
obj1.country = '美国'
print(Person.country,obj1.country)
print(obj1.__dict__)
运行结果:
中国 中国
{}
中国 美国
{'country': '美国'}
可以看到类变量的值没有改变,也就是上面试图去修改类变量的值,python会自动创建一个country对象变量,并赋值为美国,通过__dict__查看对象obj1的属性可以看到增加了country的对象属性.
2.对象属性:在类中的方法中声明的变量,只属于对象,调用的方法为self.变量名,或者对象名.变量名.
class Person(object):
country = '中国'
def __init__(self,name,age):
self.name = name
self.age = age
def getInfo(self):
print(self.name,self.age,self.country)
obj1 = Person('张三',18)
print(obj1.name)
print(obj1.age)
运行结果:
张三
18
3.类方法:在类定义的方法,且使用@classmethod修饰的,形参为cls的,这样的方法就是类方法.类方法可以被类直接调用,也可以被对象调用.
class Person(object):
country = '中国'
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def getInfo(cls):
print(cls.country)
obj1 = Person('张三', 18)
print(obj1.name)
print(obj1.age)
Person.getInfo()
obj1.getInfo()
运行结果:
张三
18
中国
中国
4.对象方法:在类定义的,形参为self的.可以被对象调用.
class Person(object):
country = '中国'
def __init__(self, name, age):
self.name = name
self.age = age
@classmethod
def getInfo(cls):
print(cls.country)
def getTest(self):
self.getInfo()
obj1 = Person('张三', 18)
print(obj1.name)
print(obj1.age)
Person.getInfo()
obj1.getInfo()
obj1.getTest()
运行结果:
张三
18
中国
中国
中国
上面的__Init__()和getTest()均是对象方法.
5.静态方法:使用@staticmethod声明的,参数没有要求,可以被类直接调用,也可以被对象调用.与类方法,对象方法直接没有什么关联,只是表示该方法属于在这个类定义的命名空间中.
class Person:
@classmethod
def class_method(cls):
print('class = {0.__name__} ({0})'.format(cls))
cls.HEIGHT = 170
@staticmethod
def sta_fun():
print("这是静态方法")
Person.class_method()
print(Person.__dict__)
obj = Person()
Person.sta_fun()
obj.sta_fun()
运行结果:
class = Person (<class '__main__.Person'>)
{'__module__': '__main__', 'class_method': <classmethod object at 0x000001BBBB80A240>, 'sta_fun': <staticmethod object at 0x000001BBBB80A0F0>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__doc__': None, 'HEIGHT': 170}
这是静态方法
这是静态方法