Python 基础7 方法 属性 继承 多态 设计模式

目录

方法没有重载

方法的动态性

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

@property装饰器

面向对象三大特征  封装  继承  多态

继承

方法的重写

object根类()

重写 __str__()方法

 多重继承

super()获得父类的定义,不是父类的对象

 多态

特殊方法和运算符重载

运算符重载

特殊属性

对象的浅拷贝和深拷贝

组合

设计模式

工厂模式

设计模式

单例模式实现


方法没有重载

如果定义多个方法是重名的,只有最后一个有效,前面的全部被覆盖

方法的动态性

python是动态语言

问题:如何给play_game()函数传参?

class Person:
    def work(self):
        print("努力上班")
def play_game(s):
    print("{0}在玩游戏".format(s))
def work2(s):
    print("努力上班")
    
Person.work=work2
Person.play=play_game
p=Person()
p.work()
p.play()

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

1.两个下划线开头的就是 私有的

2.类内部可以访问私有方法和私有属性

3.外部不能直接访问私有属性私有方法

4._类名__私有属性名 可以访问私有属性

私有属性与私有调用方法测试

class Employee:
    __company="aaaa"
    def __init__(self,name,age):
        self.name = name
        self.__age = age
    def __work(self):
        print("haohaogzuo")
        print("{0}岁".format(self.__age))# 类内部直接调用
        print(Employee.__company)# 类内部直接调用

        
e=Employee("dd",18)
e._Employee__work()
print(e.name)
print(e._Employee__age)# 类外部用特殊方法调用
print(dir(e))
print(e._Employee__company)# 类外部用特殊方法调用

@property装饰器

可以将一个方法的调用变成“属性调用”,服务 getter和setter方法

class Employee:

    def __init__(self,name,age):
        self.name = name
        self.__age = age
    @property
    def salary(self):
        print("salary")
        return 10000

        
e=Employee("dd",18)
print(e.salary)

原始方法

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")

e=Employee("dd",1000)
e.set_salary(20)
print(e.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")

e=Employee("dd",1000)
e.salary=-100
print(e.salary)

面向对象三大特征  封装  继承  多态

继承

一个子类可以直接继承多个父类,不指定则默认父类是object类

class Employee:
    def __init__(self,name,salary):
        self.name = name
        self.__salary = salary
    def salary(self):
        print("普通方法")
    def __sat(self):
        print("私有方法")
   
class Student(Employee):
    def __init__(self,name,salary,score):  # 父类的属性 子类需要初始化继承
        Employee.__init__(self,name,salary) #调父类的构造器,必须显示不然不会被调用
        self.score = score
    pass

print(Student.mro()) # mro()函数 打印类的层次
s=Student("gao",3000,30) 
s.salary() # 父类的方法 子类可以直接调用
print(s.name)
print(s._Employee__salary)  # 对于父类的私有属性和私有方法需要按照特定格式调用
s._Employee__sat()
print(dir(s)) # 用来查对象所有的属性

方法的重写

子类继承父类方法后,可以对方法进行重写,相当于覆盖,用于改造方法

class Employee:
    def __init__(self,name,salary):
        self.name = name
        self.__salary = salary
    def salary(self):
        print("普通方法")
    def __sat(self):
        print("私有方法")
   
class Student(Employee):
    def __init__(self,name,salary,score):  # 父类的属性 子类需要初始化继承
        Employee.__init__(self,name,salary) #调父类的构造器,必须显示不然不会被调用
        self.score = score
    def salary(self):
        print("子类重写父类方法,相当于对父类方法进行覆盖")
    

print(Student.mro()) # mro()函数 打印类的层次
s=Student("gao",3000,30) 
s.salary() # 父类的方法 子类可以直接调用
print(s.name)
print(s._Employee__salary)  # 对于父类的私有属性和私有方法需要按照特定格式调用
s._Employee__sat()
print(dir(s))

object根类()

名字小写 ,方法也是属性 只不过可以通过()调用​​​​​​​

重写 __str__()方法

class Person:
    def __init__(self,name):
        self.name = name
    def __str__(self):
        return "名字是{0}".format(self.name)
p = Person("高")
print(p)

 多重继承

一个子类可以有多个直接的父类,类层次结构会复杂  尽量别使用

calss A(B,C)

如果B,C中有重名的方法,调用按照顺序   调用B的方法

super()获得父类的定义,不是父类的对象

class A:
    def say(self):
        print("A",self)
class B(A):
    def say(self):
        super().say()
        print("B",self)

B().say()

 多态

1方法多态

2继承重写

class Man:
    def eat(self):
        print("吃饭")
class Chinese(Man):
    def eat(self):
        print("筷子")
class English(Man):
    def eat(self):
        print("叉子")
        
def ManEat(m):
    if isinstance(m,Man):
        m.eat()
    else:
        print("不吃饭")
ManEat(Chinese())
ManEat(English)

特殊方法和运算符重载

每一个符号都对应一个方法,都是对象

运算符重载

class Person:
    def __init__(self,name):
        self.name=name
    def __add__(self,other):
        if isinstance(other,Person):
            return "{0}-{1}".format(self.name,other.name)
        else:
            return "不能相加"
p1=Person("gao")
p2=Person("zzz")
print(p1+p2)

特殊属性

对象的浅拷贝和深拷贝

回顾 python基础5

组合

实现代码复用   is-a关系依然用继承   has-a关系用组合

直接把类当成参数赋给另一个类

设计模式

工厂模式

设计模式

单例模式实现

只生成一个实例对象

class CarFactory:
    __obj = None
    __init_flag=True

    def create_car(self,brand):
        
        if brand=="奔驰":
            return Bens()
        elif brand == "宝马":
            return BMW()
        
    def __new__(cls,*args,**kwargs):  # 重写new方法
        if cls.__obj==None:
            cls.__obj=object.__new__(cls)
        return cls.__obj
    
    def __init__(self):
        if CarFactory.__init_flag:
            print("init")
            CarFactory.__init_flag=False
class Bens:
    pass
class BMW:
    pass

f1=CarFactory()
f2=CarFactory()
print(f1)
print(f2)

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值