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'
View Code

  执行结果如下:

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
View Code

 

二、类方法  、 静态方法

   通过方法修改类属性 ; 静态方法(类似于增加一个功能函数)

  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)
View Code

  执行结果如下:

动物
微生物
狗类

Process finished with exit code 0
View Code

  

  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()
View Code

 

  执行结果如下:

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
View Code

 

posted @ 2021-08-01 13:12  空-山-新-雨  阅读(150)  评论(0编辑  收藏  举报