Python_object_oriented

“”"
语法:
class 类名:
def init(self,参数):
self.数据 =参数

“”"
面向对象 ----> 的函数叫做方法
面向过程-----> 的函数叫做函数

变量 = 类名(参数) #标准#构造函数


习题
1.定义函数,将列表中奇数设置为1
2. 定义函数,将列表中奇数删除
测试数据:[3,4,5,6,7,8,9,13]
结论; 在 列表中删除多个元素,倒序删除

解答
1.

def change_all_by_odd(list01):
                for i in range(len(list_target)):
                       if list_target[i] %2:
                           list_target[i] =1    
 2. 
def delete_all_by_odd(list01):
                for i in range(len(list_target)-1,-1,-1):   #range(start:int ,stop:int, set:int)  开始,结束,步长
                       if list_target[i] %2:
                            del list_target[i]    
   list01 = [3,4,5,6,7,8,9,13] 
   change_all_by_odd(list01)
   list01 = [3,4,5,6,7,8,9,13] 
   delete_all_by_odd(list01)       
 错误解答. def delete_all_by_odd(list01):
                     for i in range(len(list_target)):
                          if list_target[i] %2:
                            del list_target[i]    
     **问题1.**:出现漏删--后面的元素向前挤,
           **2.  越界** --删除元素列表长度减少  

根据条件在容器中删除多个元素。。倒序删 如果删除一个可以随便删


实例变量 (实例方法)
1.语法
(1)定义:对象.变量名
(2)调用: 对象.变量名

    **例:**

```python
 a= 11                   #全局变量,存储在文件中----------------------
 class Wife:
         total_account = 10   #类变量 存储在类中---------------------
         
         @classmethod   #有类变量是可以使用类方法
         def print_total_account(cls):
               print(...)   
         def __init__(self,name):
                a=1          
                self.name = name       #实例变量:存储在对象中------------
                Wife.total_account -=a
         def work(self):
                b= 1          #局部变量  存储在栈帧中 ---------------------
                print(self.name +"工作")  #可以使用自身实例的对象


w01 = Wife("双儿")  # 首次是创建实例  再次是修改实例
w01.__dict__    #存储了对象所有的实例变量   显示为{"name":"双儿"}
w01.work()     #自动传递对象地址work(w01) 
 Wife.work(w01)  #手动传递对象地址 类名.方法名(对象地址)
             
生成代码的快捷键   ---alt+enter
----------------------------------------------------------------------------------------
**类 (方法) 操作类变量**
      类成员 
              类变量
                    创建:在类中
                    使用:类名.类变量
               
              有类变量一般使用类方法 
                   例:
                        @classmethod               #类变量方法
                        def print_total_account(cls):
                                  print(...)  

 
------------------------------------------------------------------------------------------
**封装行为**  
             对外限制行为  
             需求:类的定义者
                      **property**属性 
                                  价值:保护实例变量
                                        1. 属性名与实例变量名称相同(拦截)
                                        2.属性中操作私有变量(需要被保护)
                                  核心:拦截
             例 : 
                    #age = property(读取函数)
                    (1)创建属性对象property()  #属性
                      (2)将下面的函数作为参数property(读取函数)
                    (3)将属性对象交给变量名关联age
                

class Wife:
                          def __init__(self,name,age)
                                 self.name =name
                                 self.age=age
                          @property
                           def age(self):                    #读取函数
                                  return self.__age
                          @age.setter                    #age.setter是设置函数或说修改函数,调用属性的setter函数,将下面的函数作为参数setter(设置函数)
                           def age(self,value):
                                  if 25<=value<=30:
                                        self.__age=value
                                  else:
                                        raise Exception("报错")
               mywife = Wife("xier",25)  --->如果年龄不在25-30之间就会报错
               mywifi.name
             **例2** 
              

```python
    class mouse:
    def __init__(self, name=None, price=None, weight=None, color=None):
        self.name =name
        self.price =price
        self.weight = weight
        self.color = color

    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self,value):
        if len(value)<6:
            self.__name = value
        else:
            raise Exception("字符太长")
    @property
    def price(self):
        return self.__price
    @price.setter
    def price(self,value):
        if 0<value<10000:
            self.__price = value
        else:
            raise Exception("价格太贵")

    @property
    def weight(self):
        return self.__weight
    @weight.setter
    def weight(self,value):
        if 100<value<1000:
            self.__weight = value
        else:
            raise Exception("超重")

if __name__ == '__main__':
    buying_thing =mouse("雷神雷蛇",100,200,"红色")
    print("商品:"+buying_thing.name,"价格:"+str(buying_thing.price))

“”"
属性各种写法
“”"
(1)写法1 .读写(能够对外提供读取和设置修改)
例:

class Wife:
def init(self, age=None):
self.age=age ————为私有变量赋值

                            @property      #---------------------->  快捷键  props 按TAB键  格式出来了
                           def age(self):       #读取函数
                                   return self.__age        
                          @age.setter        #设置函数
                          def age(self, value):
                                   self.__age=value

         **(2)写法2: 只读(只对外提供读取功能,类外不能修改)**

class Wife:
def init(self, age=0):
self.__age=age ————为私有变量赋值

                            @property      #---------------------->  快捷键 property +回车   格式出来了
                           def age(self):       #读取函数
                                   return self.__age        


           **(3) 写法3 :只写(只能够对外提供设置功能)**
                #快捷键: 无 

class Wfie:
def init(self, age=None):
self.age=age #执行设置函数

                           age = property()       
                          @age.setter              #设置函数
                          def age(self, value):
                                   self.__age=value

封装设计思想:
分而治之,变则疏之,高内聚,低耦合

类与类调用语法
1写法.直接创建对象调用
例 :

 class A :
                             def func01(self):
                                     b = B()
                                     b.func02()
                      class B:
                             def fun02(self):
                                     print("func02")
                      if __name__ == '__main__':
                             g01= A()
                             g01.func01()
        ****2.写法:构造函数创建对象调****
  class A :
                              def __init__(self):
                                      self.b = B()
                             def func01(self):
                                     self.b.func02()
                      class B:
                             def fun02(self):
                                     print("func02")           
                      if __name__ == '__main__':
                             g01= A()
                             g01.func01()     
         **3写法.  通过传递参数调用**         
 class A :
                         def func01(self,c):
                                 c.func02()
                  class B:
                         def fun02(self):
                                 print("func02")           
                  if __name__ == '__main__':
                         g01= A()
                         g02 = B()
                         g01.func01(g02)          

继承
代码不用子类写,但是子类能使用

         例: 
class Persondef say(self):
                            print("说话")
           
           class Student(Person):  
                    def study(self):
                            print("学习")

           class Teacher(Person):
                    def teach(self):
                            print("教学")

    #创建子类对象,可用调用父类方法和子类方法
            if __name__ == '__main__':
                 s01 = Student()
                 s01.study()
    #创建父类对象,只能调用父类对象
            if __name__ == '__main__':
                 p01 = Person()
                 p01.say()


    instance(对象,类型)       -----------------------------------------     判断关系
#  学生对象  是一种   学生类型  

 print(isinstance(s01,Student))  ---->True
 print(isinstance(s01,Person))  ---->True
 print(isinstance(s01,Teacher))  ---->False

  
    issubclass(类型,类型)  -----------------------------         判断关系                             
#  学生对象  是一种  学生类型

    print(issubclass(Student,Person))  ---->True


    Type(对象)==类型   ------------------- 相等/相同/一模一样
# 学生对象的类型     是    人类型 
    print(type(s01) == Person))  ---->False
     print(type(s01) == Student))  ---->True

继承数据
例:

class Person:
def init(self,name=0,age=0):
self.name =name
self.age=age
class Student:
pass

#子类没有构造函数,可以直接使用父类
s01 =Student() ----子类没有数据可以正常调用父类

     例2:

class Person:
def init(self,name=0,age=0):
self.name =name
self.age=age
class Student:
def init(self,score=0):
super().init(name,age) #---------------- 通过super()调用父类实例成员,才能直接是使用
self.score = score

#子类有构造函数,会覆盖父类构造函数(好像他不存在),所以子类需要通过super() 调用父类构造函数

            s01 = Student("小明",24,100)


------------------------------------------------------------------------------

       def __str__(self): 
             return f""
              
        def __repr__(self): 
             return 

运算符重载
定义:让自定义的类生成的对象

             # +无论可变还是不可变对象,都创建新对象
             #  +=对于可变对象,在原有的基础上进行修改,对于不可变对象,创建新对象

--------------------- 算数运算符:

                   方法                                  运算符和表达式                 说明
               __add__(self,rhs)                       self+  rhs                         加法 
               __sub__(self,rhs)                       self-rhs                             减法
               __mul__(self,rhs)                       self*rhs                             乘法
              __truediv__(self,rhs)                    self/rhs                            除法
              __floordiv__(self,rhs)                    self//rhs                          地板
              __mod__(self,rhs)                        self%=rhs
              __ipow__(self,rhs)                        self**=rhs
   
   例:
 

class Vector:
            def __init__(self,x,y)
                  self.x = x
                  self.x = y

       pos01 = Vector(1,2)
      pos02 = Vector(3,4)
      pos03 = pos01+pos2  ---> 报错不可相加 但是加速函数__add__ 可以相加
       改为:
  class Vector:
        def __init__(self,x,y)
              self.x = x
              self.x = y
         def __add__(self,other)
              return Vector(self.x+other.x,self.y+other.y)

如果:写成
pos01 = Vector(1,2)
post01+=Vector(3.4) -->报错需要加__iadd__
改成:
class Vector:
def init(self,x,y)
self.x = x
self.x = y
def iadd(self,other)
#因为自定义类是可变对象,所以返回原有对象self不是可创对象
self.x+=other.x
self.y+=other.y
return self

    # +无论可变还是不可变对象,都创建新对象
     #  +=对于可变对象,在原有的基础上进行修改,对于不可变对象,创建新对象
      list01 = [1]
       print(id(list01))    
        list01+=[2]
         print(id(list01))            #两个一样
 
             tuple01=(1,)
             print(id(tuple01))
           tuple+=(2,)
           print(id(tuple02))       #两个不一样,

---------------比较运算符
重写比较运算符

== #比较内容是否相同
is #比较地址是否相同

                           方法名                        运算符合符合赋值                 说明
                       __lt__(self,rhs)                 self<rhs                               小于
                       __le__(self,rhs)                 self<=rhs                           小于等于
                       __gt__(self,rhs)                 self>rhs                              大于
                       __ge__(self,rhs)                 self>=rhs                           大于等于
                       __eq__(self,rhs)                 self==rhs                           等于
                       __ne__(self,rhs)                 self!=rhs                           不等于

       常见 __eq__ 定义相同依据
              __lt__定义大小依据

       例:
class Employee:
                  def __init__(self,eid=0,did=0,name="",money=0)
                            self.eid = eid
                             self.did = did
                              self.name = name
                              self.money = money

                  def __eq__(self,other):
                            return self.eid ==other.eid

                  def __lt__(self,other):
                            return self.money<other.money
      list_employees =[Employee(1001,9001,"小老虎",2000),
                                Employee(1002,9001,"小白兔",1000), 
                                Employee(1002,9001,"师傅",1000), 
                                Employee(1003,9001,"小白",1000), 
                               ]
          print(list_employees.count(Employee(1001)))
          print(list_employees.index(Employee(1005)))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值