python继承父类属性_python继承和动态属性

一、私有属性

私有属性: __开头或者_开头,即双下划线开头的叫做私有属性,不能再类外部使用,只能在类里面使用

私有方法:__开头或者_开头

注意点:以后看到_下划线开头的属性或者方法,都不要去动或者使用

classSOS:

attr= 100_attr= 222 #这是单下划线,在外部访问,但是不要在类外部使用

__attr = 999 #这是双下划线,强制拒绝外部访问

print(SOS.attr) #打印出 100

print(SOS.__attr) #报错!!!因为是私有属性,所以访问不到

二、继承

# 默认继承

class 类名:

pass

class 类名(继承的父类):

pass

object(基类):python中所有类的祖宗(所有的类都继承于它)

继承:子类通过继承能够拥有父类的属性和方法(私有属性和私有方法除外)

classBaseClass:

attr= "base"

deffunc(self):print("--------base---func---------")classMyClass(BaseClass):deffunc2(self):print("--------自己的的func2---------")#实例化一个对象m

m =MyClass()print(m.attr) #打印出 base

m.func() #打印出 --------base---func---------

m.func2()#打印出 --------自己的的func2---------

2.1 继承示例

#案例一:通过继承方法去实现#手机一代#手机二代#手机三代

#1995年的手机

classPhoneV1:"""手机一代"""

def __init__(self, name):

self.name=namedefcall_phone(self):print(f"{self.name}使用了打电话的功能")#2002年的手机

classPhoneV2(PhoneV1):"""手机二代"""

deflisten_music(self):print(f"{self.name}使用了听音乐的功能")defsend_msg(self):print(f"{self.name}使用了发短信的功能")#2010年的手机

classPhoneV3(PhoneV2):"""手机三代"""

defgame(self):print(f"{self.name}使用了玩游戏的功能")defpay(self):print(f"{self.name}使用了支付的功能")

m= PhoneV3("oppo")

m.call_phone()#oppo使用了打电话的功能

2.2 重写父类方法

重写父类方法(重点!!!):在子类中定义一个和父类重名的方法,工作中常用

classBase(object):defbase_func(self):print("----Base----base_func---------")classA(Base):defbase_func(self):print("----A子类----base_func---------")#方式一:父类名.方法名(self)

Base.base_func(self)#方式二:super().方法名

super().base_func()#实例化对象a

a =A()#调用子类中的自己的方法,虽然重写了方法,但会直接覆盖,会调用子类的方法

a.base_func() #打印出 ----A子类----base_func---------

#如果想调用父类中的方法呢?怎么办?

重写方法的实际应用场景:看下面的代码

应用场景:

父类原有的方法不能满足原有的需求,需要对父类中的方法进行扩展

开放封闭原则:

已经实现的功能不要进行修改(对修改是封闭的)

对扩展的功能是开放的

classBaseClass(object):#姓名、身高

def __init__(self, name, height):

self.name=name

self.height=heightclassMyClass(BaseClass):#姓名、身高、年龄、性别

def __init__(self, name, height, age, sex):#调用父类的方法

super().__init__(name, height)#重写之后扩展的功能代码

self.age =age

self.sex=sexdeffunc(self):pass

#实例化对象c

c = MyClass("jack", 172, 18, "boy")print(c)

# ----------------------------------------上面是代码-------------------------------------------------------------

# ---------------------------------------下面是截图解析---------------------------------------------------

三、属性动态设置

动态设置属性:

1、setattr(obj,属性名,属性值):在代码执行的过程中给 类/对象 设置属性,(属性不存在就是添加,存在就是修改)

这个obj可以是类也可以是对象

2、getattr(obj,属性名,默认值):在代码执行的过程中获取 类/对象属性

3、delattr(obj,属性名):在代码执行的过程中删除 类/对象属性

3.1 setattr

setattr(obj,属性名,属性值):在代码执行的过程中给 类/对象 设置属性,(属性不存在就是添加,存在就是修改)

classBaseClass(object):#姓名、身高

def __init__(self, name, height):

self.name=name

self.height=height#动态设置类属性(这种不建议使用)

BaseClass.attr = 18BaseClass.attr2= 185

print(BaseClass.attr) #打印 18#__dict__ 可以查看所有的属性

print(BaseClass.__dict__)#1.setattr()

setattr(BaseClass, "attr3", 99)print(BaseClass.attr3) #打印 99

#如何将变量的值设置为类属性名

var = input("请输入属性名:")

value= "8899"setattr(BaseClass, var, value)print(BaseClass.__dict__)#给对象动态设置属性

b1 = BaseClass("tom", "男")

setattr(b1,"weight", 60)print(b1.__dict__) #打印出 {'name': 'tom', 'height': '男', 'weight': 60}

3.2 getattr

getattr(obj,属性名,默认值):在代码执行的过程中获取 类/对象属性

classBaseClass(object):#姓名、性别

def __init__(self, name, sex):

self.name=name

self.sex=sex

b1= BaseClass("汤姆", "男")#需求:根据用户输入的属性名,获取对应的属性值

item = input("请输入一个属性名:")

res1= getattr(b1, item, "None") #这里的第三个参数,可以自己设置成一个默认值

print(res1) #打印为 {'name': '汤姆', 'sex': '男'}

3.3 delattr

delattr(obj,属性名):在代码执行的过程中删除 类/对象属性

classBaseClass(object):#姓名、性别

def __init__(self, name, sex):

self.name=name

self.sex=sex

b2= BaseClass("汤姆", "男")#需求:根据用户输入的属性名,删除对应的属性值

item2 = input("请输入一个属性名:")

delattr(b2, item2)print(b2.__dict__) #打印为 {'sex': '男'},已经将name属性删掉了

接下来看一个简单的案例:

#需求:打印出name之外的所有属性

classBaseClass(object):#姓名、性别、年龄

def __init__(self, name, sex, age):

self.name=name

self.sex=sex

self.age=age

b3= BaseClass("拖米", "男", 25)

setattr(b3,"aa", 11)

setattr(b3,"bb", 22)

setattr(b3,"cc", 33)print(b3.__dict__) #打印结果为{'name': '拖米', 'sex': '男', 'age': 25, 'aa': 11, 'bb': 22, 'cc': 33}

keys= b3.__dict__.keys()for key inkeys:if key != "name":print(getattr(b3, key)) #打印出 男、25、11、22、33

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值