python学习笔记--类属性、类方法,静态方法

"""
python的类属性,就是python中将一个类,作为类对象,类属性可以通过类对象访问
author:一叶扁舟

"""

class Dog:
    # 共有的类属性
    name = "狗"
    # 私有的类属性
    __age = 12

    def __init__(self,color,sex):
        self.color = color
        self.sex = sex

    # 实例方法,函数的第一个参数写self
    def  eat(self):
        print("%s正在吃。。。。",self.name)

    # 类方法,函数里面的第一个参数写cls
    @classmethod
    def  run(cls):
        print("%s 今年%d岁了"%(cls.name,cls.__age))

    #  静态方法,函数可以不写参数
    @staticmethod
    def sleep():
        print("狗正在睡觉。。。。。")

dog = Dog("白色","公的")
# 正确
print(dog.name)
# 正确
print(Dog.name)
# 错误
# print(dog.__age)
#错误
# print(Dog.__age)

# 实例对象取出实例属性和类属性
print(dog.name)
print(dog.color)
print(dog.sex)

# 类对象无法实例属性
# print(Dog.color)
# print(Dog.sex)

"""
总结
如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,
这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,
即引用的是实例属性,除非删除了该实例属性。
"""


print("-"*120)

# 类方法可以用实例对象访问也可以用类对象访问
print(dog.run())
print(Dog.run())

"""
总结
从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
而实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),
不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类对象来引用
"""

猜你喜欢

转载自blog.csdn.net/u011662320/article/details/81024906