python---面向对象(二)类的成员

 1. 类方法

1. 创建类方法和调用

创建类方法

class Animal(object):
    def eat(self, food):
        print(f'eating {food}')
    def play(self):
        print('eating')
    def sleep(self):
        print('sleeping')

调用类方法

在调用时,使用对象.实例方法的形式调用

dog = Animal()   #实例化对象
dog.eat('meat')    #通过实例对象调用方法
dog.play()    #通过实例对象调用方法
dog.sleep()    #通过实例对象调用方法

 self的作用

首先明确的是self只有在类的方法中才会有,独立的函数或方法是不必带有self的。self在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。

self名称不是必须的,在python中self不是关键词,你可以定义成a或b或其它名字都可以,但是约定成俗(为了和其他编程语言统一,减少理解难度),不要搞另类,大家会不明白的。

下例中将self改为myname一样没有错误:

class Animal(object):
    def eat(cls, food):
        print(f'eating {food}')

dog = Animal()
dog.eat('meat')

 

self指的是类实例对象本身(注意:不是类本身)。以下的例子中self指向Animal类的dog实例

class Animal(object):
    def eat(self, food):
        print(f'eating {food}')

dog = Animal()
print(dog)

#运行结果: <__main__.Animal object at 0x020AE508>

如果self指向类本身,那么当有多个实例对象时,self指向哪一个呢?如下例:

class Animal(object):
    def eat(self, food):
        print(f'eating {food}')

dog = Animal()
pig = Animal()

所以:

self在定义时需要定义,但是在调用时会自动传入。

self的名字并不是规定死的,但是最好还是按照约定是用self

self总是指调用时的类的实例

2. __init__初始化方法

 init 前后是两个下划线 ,_ _init_ _ 初始化方法,在实例化对象的时候,自动调用

class Animal(object):
    def __init__(self):
        print("I'am an animal")

    def eat(self, food):
        print(f'eating {food}')

    def play(self):
        print('playing')

    def sleep(self):
        print('sleeping')

dog = Animal()     #实例化时,自动调用__init__方法
#运行结果: I'am a animal

2. 类属性

 1. 实例属性

在实例中定义的属性叫做实例属性, 一般静态定义,通常定义在__init__初始方法里;也可以动态定义, 在外部定义。如下例

class Animal(object):
    def __init__(self, name, age):
        self.name = name    #实例属性
        self.age = age      #实例属性

    def eat(self, food):
        print(f'{self.name} eating {food}')

    def play(self):
        print(f'{self.age}-year-ols {self.name} is playing')

    def sleep(self):
        print('sleeping')


dog = Animal('Teddy', 6)        #创建实例对象, 并
dog.gender = ''        #通过实例对象定义动态实例属性,这个属性是dog独有的
dog.play()      #调用实例对象
print(dog.gender)       #打印实例属性
print(dog.name)     #通过实例对象调用实例属性,并打印

"""
6-year-ols Teddy is playing
公
Teddy

"""


pig = Animal('Paige', 3)      #创建实例对象
pig.play()      #调用实例对象
print(pig.name)     #通过实例对象调用实例属性,并打印
print(pig.gender)       #打印实例属性-----报错, 因为gender是dog对象特有的属性

"""
    print(pig.gender)       #打印实例属性
AttributeError: 'Animal' object has no attribute 'gender'
3-year-ols Paige is playing
Paige
"""

 2. 类属性(类变量)

  • 私有属性: 属性的名称以两个下划线开始,则为私有类型;只能在类内调用

  • 公有属性: 属性的名称没有以两个下划线开始,则为公有属性;类内和内外都可调用

class Animal(object):
    age = 5       #类属性(公有)
    __gender = ''       #类属性(私有)

    def __init__(self, name):
        self.name = name    #实例属性

    def eat(self, food):
        print(f'{self.name} eating {food}')
        print(Animal.__gender)      #在类内通过Animal对象调用私有类属性

    def play(self):
        print(f'{self.age}-year-ols {self.name} is playing')

    def sleep(self):
        print('sleeping')

dog = Animal('Teddy')       #实例化对象
dog.eat('meat')     #通过实例化对象调用实例方法
print(f"{dog.name}'s age is {dog.age}")      #通过实例对象,打印类属性:age----5
print(dog.__gender)     #报错, 不能在类外通过实例对象调用私有类属性
print(Animal.__gender)     #报错, 不能在类外通过实例对象调用私有类属性

pig = Animal('Paige')       #实例化对象
print(f"{pig.name}'s age is {pig.age}")        #通过实例对象,打印类属性:age---5

print(f"Animal's age is {Animal.age}")       #打印类属性: age ---5

 3. 通过实例属性修改类属性

class Animal(object):
    age = 5     #类属性(共有)

    def __init__(self, name):
        self.name = name    #实例属性

    def eat(self, food):
        print(f'{self.name} eating {food}')

    def play(self):
        print(f'{self.age}-year-ols {self.name} is playing')

    def sleep(self):
        print('sleeping')

dog = Animal('Teddy')       #实例化对象
dog.age = 8     #通过实例属性修改类属性
print(f"{dog.name}'s age is {dog.age}")      #打印实例属性
del dog.age     #删除实例属性
print(f"{dog.name}'s age is {dog.age}")      #打印类属性

pig = Animal('Paige')       #实例化对象
print(f"{pig.name}'s age is {pig.age}")        #通过实例对象,打印类属性:age---5

Animal.age = 10     #修改类属性
print(f"Animal's age is {Animal.age}")       #打印类属性: age ---10

 

posted @ 2022-01-17 16:35  ElsaWang  阅读(67)  评论(0)    收藏  举报