004、面向对象(二)、属性 和 方法 ,类方法 、 静态方法
一、面向对象(二)、属性 和 方法:
1、类属性和实列属性重名了,对象访问属性时,是访问类还是实列自己的? 实列自己的;
2、在类中,实列方法可以调用其他实列方法吗? 可以;
3、在类中的实列方法中可以给对象设置属性吗 ?
可以,但是不建议这样做,同时pycharm报警告;
动态添加属性,只有在调用方法后才会生效 ;
4、类中方法的参数,可以是其他类的实列对象吗? 可以是
5、给当前对象添加属性,该属性只属于该对象,其他对象调用会报错 ;
示例代码如下:
# 1a、类属性和实列属性重名了,对象访问属性时,是访问类还是实列自己的? 实列自己的; class Cat(): color = '黄色' def __init__(self, name, color): self.name = name self.color = color def get_color(self): print(self.color) def show_color(self): self.get_color() c = Cat('加菲', '灰色') c.get_color() # 1b、有类属性,但无实例属性,访问时,访问的是类属性 ; class Cat(): color = '黄色' def __init__(self, name): self.name = name def get_color(self): print(self.color) c = Cat('加菲') c.get_color() # 2、在类中,实列方法可以调用其他实列方法吗? 可以; class Dog(): def __init__(self, name, color): self.name = name self.color = color def get_color(self): print(self.color) def show_color(self): self.get_color() d = Dog('加菲', '黑色') d.show_color() # 3、在类中的实列方法中可以给对象设置属性吗 ? # 可以,但是不建议这样做,同时pycharm报警告; # 动态添加属性,只有在调用方法后才会生效 ; class Monkey(): def __init__(self, name, color): self.name = name self.color = color def set_weight(self, weight): self.weight = weight def show_weight(self): print(self.weight) m = Monkey('加菲', '黑色') m.set_weight(3) m.show_weight() # 4、类中方法的参数,可以是其他类的实列对象吗? 可以是 class Duck(): def __init__(self, name): self.name = name class Person(): def __init__(self, name): self.name = name def eat(self, duck): print('{0}吃{1}'.format(self.name, duck.name)) d = Duck('烧鸭') p = Person('八戒') p.eat(d) # 5、给当前对象添加属性,该属性只属于该对象,其他对象调用会报错 ; class Chicken(): def __init__(self, name): self.name = name chicken_a = Chicken('鸡名字A') chicken_a.gender = '母鸡' print(chicken_a.name, chicken_a.gender) chicken_b = Chicken('鸡名字B') print(chicken_b.name, chicken_b.gender) # gender 属性只属于 chicken_a 对象,chicken_b调用的话会报错 # AttributeError: 'Chicken' object has no attribute 'gender'
执行结果如下:
Traceback (most recent call last): File "D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_02.py", line 232, in <module> print(chicken_b.name, chicken_b.gender) AttributeError: 'Chicken' object has no attribute 'gender' 灰色 黄色 黑色 3 八戒吃烧鸭 鸡名字A 母鸡 Process finished with exit code 1
二、类方法 、 静态方法
通过方法修改类属性 ; 静态方法(类似于增加一个功能函数)
1、对象 / 实例 无法修改 类属性 ;
class Cat(): # 定义一个类属性(非私有属性)所有实例共有的属性, 比如:物种 = 动物 ; # 非私有属性,类和实例都可以调用 ;但是 对象 / 实例无法修改类属性 ; wu_zhong = '动物' def __init__(self, name, color, category='猫科'): self.name = name # 用 self.name 作为对象的属性,接受name的赋值 ; self.color = color self.category = category # 即没有跟类关联,又没有跟对象关联,会提示把该方法定义为静态方法 ; def change_wuzhong(self): wu_zhong = '植物' c = Cat('加菲', '灰色') c.change_wuzhong() print(Cat.wu_zhong) # 对象 / 实例无法修改类属性;打印结果还是: 动物
执行结果如下:
动物
Process finished with exit code 0
2、如果要修改类属性,这时就需要用到 类方法 ( 类装饰器语法糖 );
@classmethod def 类方法名(cls): 方法实现
a、类名.类方法() / 实例.类方法() 都可以调用 ,可以通过 实例.类方法() 修改类属性,但是不建议这样做 ;
通过 对象.类方法() 修改类属性的值,实际修改的还是类属性,所以建议 :
一般的,类属性 用 类方法 修改,实例属性 用 实例方法 修改 ;
class Cat(): # 定义一个类属性(非私有属性)所有实例共有的属性, 比如:物种 = 动物 ; # 非私有属性,类和实例都可以调用 ;但是 对象 / 实例无法修改类属性 ; wu_zhong = '动物' @classmethod def xiugai_wu_zhong(cls): cls.wu_zhong = '微生物' @classmethod def xiugai_wu_zhong_2(cls): cls.wu_zhong = '狗类' def __init__(self, name, color, category='猫科'): self.name = name # 用 self.name 作为对象的属性,接受name的赋值 ; self.color = color self.category = category # 即没有跟类关联,又没有跟对象关联,会提示把该方法定义为静态方法 ; def change_wuzhong(self): wu_zhong = '植物' c = Cat('加菲', '灰色') # 对象 / 实例无法修改类属性;打印结果还是: 动物 # 这时,如果要修改类属性,就需要用到类方法 ; c.change_wuzhong() print(Cat.wu_zhong) # 定义为类方法后,可以通过 实例对象.类方法()修改类属性,但是不建议这样做; # 通过 对象.类方法() 修改类属性的值,实际修改的还是类属性,所以建议: # 一般的,类属性用类方法修改,实例属性用实例方法修改 ; c.xiugai_wu_zhong() print(Cat.wu_zhong) Cat.xiugai_wu_zhong_2() print(Cat.wu_zhong)
执行结果如下:
动物
微生物
狗类
Process finished with exit code 0
3、静态方法
a、这个方法不需要和类关联,也不需要和实例关联,等同于在类的内部增加了一个附加功能函数 。
b、没有必然的参数,就是类内部定义了一个函数 ;
c、当在类内部定义的方法,与类、对象无关系时,在 pycharm 中会提示 改成 静态方法 ;
d、静态方法一般都是给类自己用的 ,方便类使用;
e、类 和 实例 都可 调用 ;
示例代码如下:
示例代码 Person类中的 获取天气函数,等同于 一个 附加功能函数 ;
class Person(): # 定义一个获取天气的方法,这个方法不需要和类关联,也不需要和实例关联,等同于在类的内部增加了一个附加功能函数 @staticmethod def get_weather(): weather = ['晴', '小雨', '台风', '大雪'] print('我是静态方法') return weather[2] def __init__(self, name): self.name = name def out_paly(self): weather = self.get_weather() print('{0}, 今天的天气:{1}'.format(self.name,weather)) p = Person('sky') p.out_paly() p.get_weather() Person.get_weather()
执行结果如下:
D:\SkyWorkSpace\WorkSpace\Pytest\Temp\day10\venv\Scripts\python.exe D:/SkyWorkSpace/WorkSpace/Pytest/Temp/day10/test_01/test_04.py
我是静态方法
sky, 今天的天气:台风
我是静态方法
我是静态方法
Process finished with exit code 0