python面向对象总结

1. 类和对象  类--对一类事物的抽象 没有实际意义  对象---真实客观存在的 类的实例化 类的具体化
  类的定义
Class 类名(大驼峰命名,首字母大写),默认继承object,可以多继承

2.编写一个类 两类内容:属性---变量 行为--函数(方法)
  属性 自我独有--成员属性(属于对象) 大家共享的----类属性(属于类)
行为 自我独有的--成员方法(属于对象) 大家共享的---类方法 普通函数不容许出现在类里面,方法必须是类方法或成员方法
3.构造函数 初始化函数 __init__ 不写,缺省构造器 初始化基本数据,对象被创建出来之前执行,尽量不要做业务处理
  <1>.成员变量赋值
  <2>.关键成员变量的创建
<3>.self永远指向当前对象自身,代表当前对象自身,等同于java的this
   <4>.类方法的cls代表当前类自身
class Student(object):
school = '中国python职业技术学院'

def __init__(self, name, age=0):
# 右边的name 是传参的name,左边的自定义的,把外面传进来的name 赋予给 self.name变量
self.name = name
self.age = age
self.high = 0.0
     self.score = [99, 88, 77]


def study(self):
print(f'我是{self.name},我爱学习')

def jump(self):
print(f'我是{self.name},我爱跑步')

# 类方法
@classmethod
def love_school(cls):
print(f"我爱{cls.school}")

@classmethod
def address(cls):
cls.love_school()
  创建一个Student对象
zhangsan = Student(name = '张三')
lisi = Student(name= '李四')
1.获取成员变量,通过对象来获取 
  print(zhangsan.name)
  #张三
2.修改成员变量属性,通过对象来修改,只对当前对象有效:
 zhangsan.name='张四'
 print(zhangsan.name)
#张四

3.调用成员方法,通过对象来调用,类不能调用成员方法,成员方法可以访问成员变量,类变量,调用类方法,调用成员方法
#<1>.通过对象调用成员方法study
zhangsan.study()
#我是张四,我爱学习

#<2>.类名不能调用成员方法
  #通过Student类调用成员方法study
Student.study()
提示错误:
TypeError: study() missing 1 required positional argument: 'self'

#<3>.成员方法可以访问成员变量:
  def jump(self):
#可以访问成员变量name属性
print(f'我是{self.name},我爱跑步')

zhangsan.jump()
   输出:
我是张四,我爱跑步
  #<4>.成员方法可以访问类变量:
    def get_school(self):
      #访问类变量school
      print(self.school)
 #<5>.成员方法可以调用类方法:
# 类方法
  @classmethod
def love_school(cls):
print(f"我爱{cls.school}")

#成员方法
def study(self):
   #调用类方法
self.love_school()
zhangsan.study()

输出:
  #我爱中国python职业技术学院

#<6>.成员方法可以调用成员方法
     #成员方法A:
def study(self):
print(f'我是{self.name},我爱学习')
     #成员方法B:
def jump(self):
#可以直接调用study方法
self.study()

zhangsan.jump()
   输出:
我是张四,我爱学习
4.获取类变量:
<1>.通过对象来获取:
print(zhangsan.school)
#中国python职业技术学院
<2>. 通过类名来获取:
print(Student.school)
#中国python职业技术学院

5.修改类变量:
<1>.通过对象来修改,只对当前对象生效,其他对象不生效:
    zhangsan.school='中国java学院'
    print(zhangsan.school) 
'中国java学院'
    print(lisi.school)
'中国python职业技术学院'
  <2>.通过类名来修改,所有的对象都生效:
Student.school = '中国C++学院'
    print(zhangsan.school)
#中国c++学院
    print(lisi.school)
    #中国c++学院
 
6.类方法定义,方法头上需要加@classmethod 注解,方法传参cls,cls代表当前类自身,可以访问类变量,可以调用其他的类方法,类无权获取成员变量,无法调用成员方法
#<1>.类方法定义
@classmethod
def love_school(cls):
#可以通过当前类cls访问类变量school
print(f"我爱{cls.school}")

#<2>.调用其他的类方法
    #类方法A:
  @classmethod
def love_school(cls):
print(f"我爱{cls.school}")

#类方法B:
@classmethod
def address(cls):
cls.love_school()
#通过对象名调用类方法:
zhangsan.address()
#我爱中国python职业技术学院

#<3>. 类无法获取成员变量:
@classmethod
def address(cls):
print(cls.name)
  zhangsan.address()
调用address方法会报错:
AttributeError: type object 'Student' has no attribute 'name'

#<4>. 类无法调用成员方法:
@classmethod
def address(cls):
#通过类调用成员方法study
cls.study()

#调用类方法:
zhangsan.address()
输出:
TypeError: study() missing 1 required positional argument: 'self'
7.类方法调用,通过类名来调用,或者通过对象来调用
  # 1.通过对象来调用
zhangsan=Student(name='张三')
   zhangsan.love_school()

# 2.通过类名来调用
Student.love_school()
8.静态方法,staticmethod ,可以访问类变量,通过类名或对象去调用,不能访问成员变量和成员方法,不需要传参
  @staticmethod
def static_song():
print(f'我爱{Student.school}')
#调用:
Student.static_song()
zhangsan.static_song()

9.重写string方法,打印对象时,按照__str__方法格式展示
  def __str__(self):
  return f'{self.school}-{self.id}-{self.name}'

print(zhangsan)
  #中国python职业技术学院-1-zhangsan
10.如果方法不需要使用成员变量,那么既可以定义成类方法,也可以定义成成员方法,如果需要使用成员变量,那么只能定义成成员方法

11.如果类里面定义了__len__()方法,那么可以对其取长度
#假设对对象的年龄取长度
def __len__(self):
    return self.age

#调用方法:
zhangsan = Student(name = '张三',age=10)
print(len(zhangsan)
#10

12.类外部的方法,需要访问类内部的成本变量和类变量
  # 把类对象当作参数,类的外部方法
def hello_my_school(obj):
print(f'我是{obj.name},我爱我的母校:{obj.school}')

# 调用类外部方法 hello_my_school
   lisi = Student(id=1, name='lisi', age=10)
hello_my_school(lisi)
#输出:
# 我是lisi,我爱我的母校:中国python职业技术学院

13.
__getitem__ 按索引取值,获取对象的索引值
    def __getitem__(self, item):
       return self.score[item]
    zhangsan = Student(name='张三')
    print(zhangsan[-1])
#77
 







posted @ 2021-01-17 15:55  maxwell11  阅读(121)  评论(0编辑  收藏  举报