面向对象

1.类的定义
  定义变量、方法
  方法必须传入self
  方法内部,如果要用类的变量,需要self.
  作用:封装代码,他将数据已经这些数据上的操作封装在一起
class Student():
    name = ""
    age = 0
    def print_file(self):
        print("name:"+str(self.name))
        print("age:"+str(self.age))
st = Student()
st.print_file()    
区分模块下的变量、函数,跟类下的成员、方法
类只负责定义一个行为,不负责执行    
2.构造函数
  默认renturn None,不能返回其他类型,这个是区别于类的普通方法的。
3.区别模块变量和类的变量
  模块下变量,是不能跟类下的变量等同的。
4.类变量与实例变量
  类变量:和类关联一起
  实例变量:和实例关联一起,通过在__init__方法中self.定义
场景一:定义类变量和实例变量name
  class Student3():
    name = "" #类变量
    age = 0
    def __init__(self,name,age):
        self.name = name #实例变量
        self.age = age
st3 = Student3("zzq",19) 
print("name:",st3.name)       
print("name:",Student3.name)
场景二:定义类变量name,实例是可以访问类变量的 
class Student4():
    name = "类变量name"
    age = 0
    def __init__(self,age):
        self.age = age
st4 = Student4(19) 
print("name:",st4.name)       
print("name:",Student4.name)
从现实世界来看,类变量定义名称和年龄是不合理的
场景三:定义有意义的类变量
class Student5():
    sum = 0
    def __init__(self,name,age):
        self.name = name 
        self.age = age 
print(Student5.sum)  
5.类和对象的变量查找顺序
__dict__内置变量可以查找对象下所有变量
场景一:如下name打印出来的竟然是类变量名称,而非实例变量名称
class Student6():
    name = "类变量名称"
    age = 0
    def __init__(self,name,age):
        name = name 
        age = age
st6 = Student6("zzq",19) 
print("name:",st6.name)  #打印“"类变量名称"”
print(st6.__dict__) #打印{},说明实例中还没有变量,上面打印类变量是因为变量查找顺序


场景二:如下name打印出来的竟然是类变量名称,而非实例变量名称
class Student7():
    name = "类变量名称"
    age = 0
    def __init__(self,name,age):
        self.name = name 
        self.age = age
st7 = Student7("zzq",19) 
print("name:",st6.name) #打印“"类变量名称"”
print(st7.__dict__)# #打印{'name': 'zzq', 'age': 19},说明实例中有变量name=‘zzq’


总结变量查找顺序:如果尝试访问一个实例变量,那么python首先在对象的实例变量列表__dict__中查找,是否存在name这样的变量,如果没有,python不会返回None,它会继续在类变量列表中寻找
如果类变量列表中也没有,会去父类变量列表中去找。
6.self与实例方法
python建议使用self,显胜于隐,self代表调用当前方法的某个对象。只跟对象实例有关,跟类没有关系,self只是代表实例,而不是类
实例方法:特征,第一个参数必须是self。
7.在实例方法中访问实例变量和类变量
①python思维导图 
变量:类变量、实例变量
方法:实例方法
构造函数
②实例变量和类变量
class Student8():
    sum1 = 0
    name = "类变量名称"
    age = 0
    def __init__(self,name,age):
        self.name = name 
        self.age = age
        print(self.name) #zzq 读取的是实例变量name
        print(self.age) #19 读取的是实例变量age
        print(name) #zzq,读取的是形参中的name
        print(age)  #19    读取的是形参中的age
        print(Student8.name) #类变量名称
        print(Student8.sum1)
st8 = Student8("zzq",19) 
print(st8.__dict__) #{'name': 'zzq', 'age': 19}
print(Student8.__dict__) #'sum': 0, 'name': '类变量名称', 'age': 0
print("name:",st8.name) #zzq
print("name:",Student8.name) #类变量名称
③实例方法中访问类变量场景一:通过self.__class__.访问类变量
class Student10():
    sum1 = 0
    def __init__(self,name,age):
        self.name = name 
        self.age = age
        print(self.__class__.sum1)  # 0
st10 = Student10("zzq",19) 
print(Student10.sum1)  # 0
④实例方法中访问类变量场景一:通过类.类变量
8.类方法
①python思维导图 
变量:类变量、实例变量
方法:实例方法、类方法
构造函数
②实例方法中操作类变量
class Student11():
    sum1 = 0
    def __init__(self,name,age):
        self.name = name 
        self.age = age
#         Student11.sum1 +=1
        self.__class__.sum1 +=1
        print("当前学生数量",str(self.__class__.sum1))
st11_1 = Student11("zzq",19) 
st11_2 = Student11("zzq2",19) 
③类方法中操作类变量,需要用到classmethod装饰器
作业:如果操作一个跟对象无关的变量,建议还是用类方法


class Student12():
    sum1 = 0
    def __init__(self,name,age):
        self.name = name 
        self.age = age
    @classmethod
    def plus_sum(cls):
        cls.sum1 +=1
        print(cls.sum1)
Student12.plus_sum() #1
Student12.plus_sum() #2
④ 实例对象也能访问类方法,不建议,逻辑上说不通
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值