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