Python基础学习Day8(上)(方法的动态性、私有属性和私有方法、继承、object根类(重写str方法))

方法没有重载

Python中没有方法的重载,定义多个同名方法,只有最后一个有效。

方法的动态性

Python是动态语言,我们可以动态的为类添加新的方法,或者动态的修改类的已有的方法。

#测试方法的动态性
class Person:
    def work(self):
        print("努力上班!")
def play_game(s):
    print("{0}谁在玩游戏".format(s))
def work2(s):
    print("好好工作!")
Person.play=play_game #为类添加新的方法
p=Person()
p.work()
p.play() #Person.play(p)

Person.work=work2#修改类已有的方法

p.work()

在这里插入图片描述

私有属性和私有方法(实现封装)

Python对于类的成员没有严格的访问控制限制,这与其他面向对象语言有区别。关于私有属性和私有方法,有如下要点:

  1. 通常我们约定,两个下划线开头的属性是私有的(private)。其他为公共的(public)。
  2. 以访问私有属性(方法)
  3. 不能直接访问私有属性(方法)
  4. 类外部可以通过“_类名__私有属性(方法)名”访问私有属性(方法)
    注:方法本质上也是属性。只不过是可以通过()执行而已。所以,此处讲的私有属性和公有属性,也同时讲解了私有方法和公有方法的用法。
#测试私有属性
class Employee:
    def __init__(self,name,age):
        self.name=name#公有属性
        self.__age=age#私有属性
e=Employee("Meidi",22)
print(e.name)#调用公有属性
print(e._Employee__age)#调用私有属性
print(dir(e))

在这里插入图片描述
升级看看私有类的属性

#测试私有属性
class Employee:
    __company="百战程序员"#私有类对象
    def __init__(self,name,age):
        self.name=name#公有属性
        self.__age=age#私有属性
    def __work(self):#私有方法
        print("好好学习")
        print("年龄:{0}".format(self.__age))#类内部调用私有属性
        print(Employee.__company)
e=Employee("Meidi",22)
print(e.name)
#print(e.__age)报错
print(e._Employee__age)
print(dir(e))
e._Employee__work()
print(Employee._Employee__company)#类的私有属性调用

在这里插入图片描述

@property装饰器

@property可以将一个方法的调用方式变成“属性调用”。增添getter、setter方法。

#测试@property的用法
class Employee:
    def __init__(self,name,salary):
        self.__name=name
        self.__salary=salary
    def get_salary(self):
        return self.__salary

    def set_salary(self,salary):
        if 1000<salary<50000:
            self.__salary=salary
        else:
            print("录入错误!薪水在1000-50000这个范围")
empl=Employee("Meidi",30000)
print(empl.get_salary())
empl.set_salary(100)
print(empl.get_salary())

在这里插入图片描述
对比着看更清晰

#测试@property的用法
class Employee:
    def __init__(self,name,salary):
        self.__name=name
        self.__salary=salary
    @property
    def salary(self): #仅可读
        return self.__salary #读
    @salary.setter #可读写
    def salary(self,salary):
        if 1000<salary<50000:
            self.__salary=salary #写
        else:
            print("录入错误!薪水在1000-50000这个范围")
'''
    def get_salary(self):
        return self.__salary

    def set_salary(self,salary):
        if 1000<salary<50000:
            self.__salary=salary
        else:
            print("录入错误!薪水在1000-50000这个范围")
'''
empl=Employee("Meidi",30000)
'''
print(empl.get_salary())
empl.set_salary(100)
print(empl.get_salary())
'''
print(empl.salary)
empl.salary=2000
print(empl.salary)

在这里插入图片描述
补充读、写的说明:
在这里插入图片描述
在这里插入图片描述
注意观察@salary.setter()有无的区别!!!

面向对象三大特征介绍

Python是面向对象的语言,也支持面向对象编程的三大特性:继承、封装(隐藏)、多态。

继承

继承是面向对象程序设计的重要特征,也是实现“代码复用”的重要手段。
如果一个新类继承自一个设计好的类,就直接具备了已有类的特征,就大大降低了工作难度。已有的类,我们称为“父类”或者“基类”,新的类,我们称为“子类”或者“派生类”。
语法格式
Python支持多重继承,一个子类可以继承多个父类。继承的语法格式如下:
class 子类类名(父类1[,父类2,…]):
类体

如果在类定义中没有指定父类,则默认父类是object类。也就是说,object是所有类的父类,里面定义了一些所有类共有的默认实现,比如:__new__()。
定义子类时,必须在其构造函数中调用父类的构造函数。调用格式如下:
父类名.__init__(self,参数列表)

#测试继承的基本使用
class Person:
    def __init__(self,name,age):
        self.name=name
        self.__age=age#私有属性
    def say_age(self):
        print("年龄:不知道")
class Student(Person):
    def __init__(self, name,age,score):
        Person.__init__(self,name,age)#必须显示的调用父类初始化方法,不然解释器不会去调用
        self.score=score
        
#Student-->Person-->object类
print(Student.mro())

s=Student("Meidi",22,100)
s.say_age()
print(s.name)
print(dir(s))
print(s._Person__age)#读父类的私有属性

在这里插入图片描述

类成员的继承和重写

1.成员继承:子类继承了父类除构造方法之外的所有成员。
2.方法重写:子类可以重新定义父类中的方法,这样就会覆盖父类的方法,也称为“重写”。

#测试方法的重写
class Person:
    def __init__(self,name,age):
        self.name=name
        self.__age=age#私有属性
    def say_age(self):
        print("我的年龄:",self.__age)
    def say_introduce(self):
        print("我的名字是{0}".format(self.name))
class Student(Person):
    def __init__(self, name,age,score):
        Person.__init__(self,name,age)#必须显示的调用父类初始化方法,不然解释器不会去调用
        self.score=score

    def say_introduce(self):
        '''重写了父类的方法'''
        print("报告老师,我的名字是:{0}".format(self.name))
s=Student("Meidi",22,100)
s.say_age()
s.say_introduce()

在这里插入图片描述

查看类的继承层次结构

通过类的方法mro()或者类的属性_mro_可以输出这个类的继承层次结构。

class A:pass
class B(A):pass
class C(B):pass
print(C.mro())

在这里插入图片描述

objiect根类

object类是所有类的父类,因此所有的类都有object类的属性和方法。

#查看对象所有属性以及和object进行比对
class Person:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def say_age(self):
        print(self.name,"的年龄是:",self.age)
obj=object()
print(dir(obj))

s2=Person("Meidi",22)
print(dir(s2))
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name', 'say_age']

重写__str__()方法

重写前

#测试重写object的__str__()方法
class Person:  #默认继承object类
    def __init__(self,name):
        self.name=name

p=Person("Meidi")
print(p)

在这里插入图片描述
重写后

#测试重写object的__str__()方法
class Person:  #默认继承object类
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return "名字是:{0}".format(self.name)
p=Person("Meidi")
print(p)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值