栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python基础之day08-面向对象基础3

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python基础之day08-面向对象基础3

Python基础之day08-面向对象基础3

文章目录
  • Python基础之day08-面向对象基础3
  • 一、
  • 二、类方法
  • 三、静态方法
  • 四、总结实例、类、静态方法

代码仓库地址: https://gitee.com/andox_yj/python

一、
  1. 类属性与实例属性介绍:

    • 实例属性:
      • 用法:对象.属性名 = 属性值 或 self.属性名 = 属性值
      • 介绍:
        • 只能用实例对象调用,不可用类对象调用,
        • 只能用实例对象修改,不可用类对象修改。否则只是为类对象创建一个新属性。
    • 类属性:
      • 用法:定义到类里面 方法的外面
      • 介绍:
        • 可以用实例对象调用,可以用类对象调用,
        • 只能用类对象修改,不可用实例对象修改。否则只是为实例对象创建一个新属性。
        • 类属性会被所有该类的实例对象所用共有。类属性不能传参,只能是在类里面定义。
        • 可以通过类方法来修改类属性(类方法后面介绍)
  2. 代码示例

    class Animal:
        english_name = "animal"  # 类公有属性
        __china_name = "动物"  # 类私有属性
    
        def __init__(self, name, age):
            self.name = name  # 实例公有属性
            self.__age = age  # 实例私有属性
    
    
    cat = Animal("汤姆", 22)
    # ################# 1.通过实例对象访问属性 ####################
    print(cat.english_name)  # animal
    # print(cat.__china_name)  # 私有类属性访问不了
    # 强制访问私有类属性
    print(cat._Animal__china_name)  # 动物
    
    # 通过实例对象访问实例属性
    print(cat.name)  # 汤姆
    # print(cat.__age)  # 私有对象属性访问不了
    # 强制访问私有对象属性
    print(cat._Animal__age)  # 22
    
    # ################# 2.通过类访问属性 ####################
    print(Animal.english_name)  # animal
    # print(cat.__china_name)  # 私有类属性访问不了
    # 强制访问私有类属性
    print(Animal._Animal__china_name)  # 动物
    
    # 通过类访问实例属性,访问不了,报错
    # print(Animal.name)
    # print(cat.__age)
    # print(Animal._Animal__age)
    
    # ################# 3.通过实例对象修改属性 ####################
    cat.name = "黑猫"
    cat._Animal__age = 16
    print(cat.name)  # 黑猫
    print(cat._Animal__age)  # 16
    
    # 注意,此处不是修改类属性,而是给实例添加了两个属性,属性名分别为english_name和_Animal__china_name
    cat.english_name = "ANIMAL"
    cat._Animal__china_name = "DONGWU"
    # 给实例添加两个属性
    print(cat.english_name)  # ANIMAL
    print(cat._Animal__china_name)  # DONGWU
    # 类属性依然不变
    print(Animal.english_name)  # animal
    print(Animal._Animal__china_name)  # 动物
    
    # ################# 4.通过类对象修改属性 ####################
    Animal.english_name = "ANIMAL"
    print(Animal.english_name)  # ANIMAL
    print(cat.english_name)  # ANIMAL
    # 注意,此处不是修改实例属性,而是给类例添加了2个属性,属性名分别为name和_Animal__age
    Animal.name = "猫"
    Animal._Animal__age = 55
    # 给类添加两个属性
    print(Animal.name)  # 猫
    print(Animal._Animal__age)  # 55
    # 实例属性依然不变
    print(cat.name)  # 黑猫
    print(cat._Animal__age)  # 16
    
二、类方法
  1. 类方法介绍:使用装饰器@classmethod。第一个参数必须是当前类对象(类也是一个对象)该参数一般为"cls",通过它来传递类的属性和方法(不能传实例的属性和方法)
  2. 类方法定义:@classmethod用来装饰类方法,写到类里的方法上面。不需要self参数,但第一个参数需要是表示自身类的cls参数。
  3. 类方法调用:类名.属性名 或 对象.方法名。
  4. 注意:类方法可以访问与修改类属性。当类方法与实例方法重名时,不管通过类对象还是实例对象来调用,都是优先使用实例方法。
  5. 代码示例
	# ################# 1.类方法的定义与调用 ####################
	class Person():
	    country = 'China'
	
	    # 类方法,用classmethod来进行装饰
	    @classmethod
	    def get_country(cls):
	        # 第一个参数就是代表这个类对象,所以cls.country 等于 Person.country
	        print(cls.country)
	
	
	p = Person()
	# 通过实例对象调用类方法
	p.get_country()  # China
	# 通过类对象调用类方法
	Person.get_country()  # China
	
	
	# ################# 2.类方法修改类属性 ####################
	class Person:
	    country = 'China'
	
	    # 类方法,用classmethod来进行装饰
	    @classmethod
	    def set_country(cls, country):
	        cls.country = country
	
	
	p = Person()
	# 通过实例对象调用类方法
	p.set_country("South Korea")
	print(p.country)  # South Korea
	print(Person.country)  # South Korea
	# 通过类对象调用类方法
	Person.set_country("North Korea")
	print(p.country)  # North Korea
	print(Person.country)  # North Korea
	
	
	# ################# 3.类方法与实例方法重名 ####################
	class Person:
	    country = 'China'
	
	    # 类方法,用classmethod来进行装饰
	    @classmethod
	    def get_country(cls):
	        print(cls.country)
	
	    def get_country(self):
	        print("这是实例方法")
	
	
	p = Person()
	# 当类方法与实例方法重名时,不管通过类对象还是实例对象来调用,都是优先使用实例方法
	p.get_country()  # 这是实例方法
	Person.get_country(p)  # 这是实例方法
三、静态方法
  1. 静态方法介绍:使用装饰器@staticmethod。参数随意,没有’self’或’cls’参数,就跟使用普通函数一样。
  2. 类方法定义:@staticmethod用来装饰静态方法,写到类里的方法上面,
  3. 类方法调用:类名.方法名 或 对象.方法名
  4. 注意:当静态方法与实例方法重名时,不管通过类对象还是实例对象来调用,都是优先使用实例方法。
  5. 代码示例:
    # ################# 1.静态方法的定义与调用 ####################
    class People(object):
        country = 'china'
    
        # 静态方法
        @staticmethod
        def get_country():
            print(People.country)
    
    
    p = People()
    # 通过对象访问静态方法
    p.get_country()  # china
    # 通过类访问静态方法
    People.get_country()  # china
    
    
    # ################# 2.静态方法与实例方法重名 ####################
    class People(object):
        country = 'china'
    
        # 静态方法
        @staticmethod
        def get_country():
            print(People.country)
    
        def get_country(self):
            print("这是实例方法")
    
    
    p = People()
    # 当静态方法与实例方法重名时,不管通过类对象还是实例对象来调用,都是优先使用实例方法
    p.get_country()  # 这是实例方法
    People.get_country(p)  # 这是实例方法
    
四、总结实例、类、静态方法
  • 实例方法:
    • 只能被对象调用。
    • 默认有个self参数。
  • 类方法:
    • 可以被类和对象调用。
    • 默认有个 cls 参数,需要加上 @classmethod 装饰器。
  • 静态方法:
    • 可以直接使用类名调用。
    • 用 @staticmethod 装饰的不带 self 参数 和cls 参数 的方法叫做静态方法,类的静态方法可以没有参数。
  • 注意:
    • 静态方法与类方法同名时,使用后面定义的方法,既会覆盖前面的。
    • 实例对象调用静态方法或类方法时,需要传入实例对象作为参数。
    • 不管是实例对象调用还是类调用,都会优先调用实例方法。
  1. 代码示例
    # ################# 静态方法与类方法同名时,使用后面定义的方法,既会覆盖前面的。 ####################
    class Person:
        @staticmethod
        def printout():
            print("静态方法")
    
        @classmethod
        def printout(cls):
            print("类方法")
    
    
    p = Person()
    p.printout()
    Person.printout()
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/932543.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号