标签:strong 设计 image ted 面向对象 位置 特点 转换 ima
关于继承:可以打个形象的比方
矩形、菱形、平行四边形和梯形等都是四边形,以平行四边形为例,如果把平行四边形看成四边形的延伸,那么平行四边形就复用了四边形的属性和行为,同时添加了平行四边形特有的属性和行为,如平行四边形的对边平行且相等。
---->在Python中可以把平行四边形类看作是继承四边形类后产生的类,其中,将类似于平行四边形的的类称为子类,将类似于四边形的类称为父类或超类,
在阐释平行四边形和四边形关系时,可以说平行四边形是特殊的四边形,却不能说四边形是平行四边形。
---->同理Python中可以说子类的实例都是父类的实例,却不能说父类的实例都是子类的实例。
基类的成员都会被派生类继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写父类的这个方法。
class Fruit: # 父类
def harvest(self):
pass
class Apple(Fruit): # 派生类
def harvest(self): # 方法重写
pass
class Fruit: # 父类
def __init__(self,color = ‘green‘):
Fruit.color = color
print(Fruit.color)
def harvest(self):
print(‘水果原来是:‘+ Fruit.color+ ‘的!‘)
class Apple(Fruit): # 派生类
def __init__(self): # 方法重写
print(‘i am apple‘)
# super().__init__()
apple = Apple()
apple.harvest()
改写后:
class Fruit: # 父类
def __init__(self,color = ‘green‘):
Fruit.color = color
print(Fruit.color)
def harvest(self):
print(‘水果原来是:‘+ Fruit.color+ ‘的!‘)
class Apple(Fruit): # 派生类
def __init__(self): # 方法重写
print(‘i am apple‘)
super().__init__()
apple = Apple()
apple.harvest()
访问方法:
类属性通过类名或实例名访问,而实例属性只能通过实例名访问。如果通过类名访问则会报错。
特殊点:实例属性可通过实例名称修改,并不影响该类其他实例中相应的实例属性的值。
(1)通过类名调用类属性:也可以通过实例名访问
class Geese:
"""雁类"""
neck = "脖子太长"
wing = "振翅频率高"
leg = "腿位于身份的中心支点,行走自如"
def __init__(self):
print("我属于雁类,我有如下特征:")
print(Geese.neck)
print(Geese.wing)
print(Geese.leg)
geese = Geese()
输出如下:
我属于雁类,我有如下特征:
脖子太长
振翅频率高
腿位于身份的中心支点,行走自如
(2)只可通过实例名访问实例属性,
class Geese:
"""雁类"""
def __init__(self):
self.neck = "脖子太长"
self.wing = "振翅频率高"
self.leg = "腿位于身份的中心支点,行走自如"
print("我属于雁类,我有如下特征:")
print(self.neck)
print(self.wing)
print(self.leg)
geese = Geese()
geese1 = Geese()
geese1.neck = "我的实例属性值改变了"
print(geese1.neck)
结果如下:
我属于雁类,我有如下特征:
脖子太长
振翅频率高
腿位于身份的中心支点,行走自如
我属于雁类,我有如下特征:
脖子太长
振翅频率高
腿位于身份的中心支点,行走自如
我的实例属性值改变了
三种形式: __foo__,__foo,_foo
class Geese:
"""雁类"""
_neck = "脖子太长"
def __init__(self):
print(Geese._neck)
geese = Geese()
print (geese._neck) # 通过类的实例访问
class Geese:
"""雁类"""
__neck = "脖子太长"
def __init__(self):
print(Geese.__neck)
geese = Geese()
print(geese._Geese__neck)
print (geese.__neck) # 通过类的实例访问
可以看出__xxx定义的私有属性只能够通过类本身调用或类实例._类名__xxx的方式调用,直接用类实例调用就会报错。
作用简单理解为,写在函数前,将一个方法转换为属性,实现用于计算的属性,外部可以直接使用函数名来访问方法,不需要写成上述5中形式,且调用方法时不需要加()。另外需要注意通过此种方式创建的私有属性是只读的,外部也不可直接赋值修改,否则会报错。
承接上面的例子,私有属性无法在外部通过类访问时。也可以通过装饰器进行解决。
class Geese:
"""雁类"""
def __init__(self,neck):
self.__sh = neck
# @property
def show(self):
return self.__sh
geese = Geese(‘脖子很长‘)
print(geese.show())
print(geese._Geese__sh)
print (geese.__sh) # 通过类的实例访问
添加装饰器:
class Geese:
"""雁类"""
def __init__(self,neck):
self.__sh = neck
@property
def show(self):
return self.__sh
geese = Geese(‘脖子很长‘)
print(geese.show)
print(geese._Geese__sh)
print (geese.__sh) # 通过类的实例访问
外部修改私有属性:
class Geese:
"""雁类"""
def __init__(self,neck):
self.__sh = neck
@property
def show(self):
return self.__sh
geese = Geese(‘脖子很长‘)
print(geese.show)
geese.show = ‘脖子不长‘
print(geese.show)
标签:strong 设计 image ted 面向对象 位置 特点 转换 ima
原文地址:https://www.cnblogs.com/hqczsh/p/11374756.html