- Python基础之day08-面向对象基础3
- 一、
- 二、类方法
- 三、静态方法
- 四、总结实例、类、静态方法
代码仓库地址: https://gitee.com/andox_yj/python 一、
-
类属性与实例属性介绍:
- 实例属性:
- 用法:对象.属性名 = 属性值 或 self.属性名 = 属性值
- 介绍:
- 只能用实例对象调用,不可用类对象调用,
- 只能用实例对象修改,不可用类对象修改。否则只是为类对象创建一个新属性。
- 类属性:
- 用法:定义到类里面 方法的外面
- 介绍:
- 可以用实例对象调用,可以用类对象调用,
- 只能用类对象修改,不可用实例对象修改。否则只是为实例对象创建一个新属性。
- 类属性会被所有该类的实例对象所用共有。类属性不能传参,只能是在类里面定义。
- 可以通过类方法来修改类属性(类方法后面介绍)
- 实例属性:
-
代码示例
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
- 类方法介绍:使用装饰器@classmethod。第一个参数必须是当前类对象(类也是一个对象)该参数一般为"cls",通过它来传递类的属性和方法(不能传实例的属性和方法)
- 类方法定义:@classmethod用来装饰类方法,写到类里的方法上面。不需要self参数,但第一个参数需要是表示自身类的cls参数。
- 类方法调用:类名.属性名 或 对象.方法名。
- 注意:类方法可以访问与修改类属性。当类方法与实例方法重名时,不管通过类对象还是实例对象来调用,都是优先使用实例方法。
- 代码示例
# ################# 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) # 这是实例方法
三、静态方法
- 静态方法介绍:使用装饰器@staticmethod。参数随意,没有’self’或’cls’参数,就跟使用普通函数一样。
- 类方法定义:@staticmethod用来装饰静态方法,写到类里的方法上面,
- 类方法调用:类名.方法名 或 对象.方法名
- 注意:当静态方法与实例方法重名时,不管通过类对象还是实例对象来调用,都是优先使用实例方法。
- 代码示例:
# ################# 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 参数 的方法叫做静态方法,类的静态方法可以没有参数。
- 注意:
- 静态方法与类方法同名时,使用后面定义的方法,既会覆盖前面的。
- 实例对象调用静态方法或类方法时,需要传入实例对象作为参数。
- 不管是实例对象调用还是类调用,都会优先调用实例方法。
- 代码示例
# ################# 静态方法与类方法同名时,使用后面定义的方法,既会覆盖前面的。 #################### class Person: @staticmethod def printout(): print("静态方法") @classmethod def printout(cls): print("类方法") p = Person() p.printout() Person.printout()



