# __func__ 前后带有双下划线__的方法叫做魔法方法,为了实现python特殊功能的 class Person(object): # 新式类建议带上继承object,经典类不会默认继承object def __init__(self, name, age): #self其实就是对象名,self可以改名字,python始终会把对象名赋值给第一个参数 self.name = name # 给对象增加name属性 self.age = age # 给对象增加age属性 print(self, id(self)) def print(self): #增加print方法 print(self.name, self.age, self.score) stu = Person('lili', 23) stu.score = 177 #可以直接给对象增加属性 stu.print() stu2 = Person('lilei', 22) # <__main__.Person object at 0x0000000002407400> <__main__.Person object at 0x0000000002547940> print(stu, stu2) print(Person, type(Person), id(Person), Person.__class__, Person.__bases__) # <class 'type'> print(stu, type(stu), id(stu), stu.__class__) # <class '__main__.Person'> #私有属性,带有__打头的属性,不允许通过对象.属性名的方式调用修改 class Cat(object): __cls_base =100 cls_num = 200 def __init__(self, name, age): self.__name = name # __name是私有变量,外部无法修改,只能通过方法访问 self.age = age def printdata(self): # print(self.age, self.__name, num, __base) #无法直接使用class中的变量,调用会出错 print('object attr', self.age, self.__name) print('cls attr', self.cls_num, self.__cls_base) Cat.num = 50 Cat.__base =20 cat=Cat('heelo', 3) cat.age = 20 # python中所有私有属性都是假的,把私有__属性名 修改为 _类名__属性名实现的 # 所以直接通过对象访问会发现没有该属性名,所以如果通过修改后的名字是可以访问的 # print(cat.__name) #报错,提示对象没有属性__name print(cat._Cat__name) #输出heelos,为啥?因为python中所有私有属性都是假的,只是把私有属性的名字修改为加上类名组在一起了 cat.__name = 'modified' # 修改不生效,运行不会报错 print(cat.__name) #输出modified,此处为啥又成功了?因为给对象增加了一个非私有属性,此时__name不是私有属性 cat.printdata() # 20 heelos ;__name修改未生效,运行不会报错,相当于有两个变量:原始的_Cat__name与新增的__name # 查看对象的所有属性与属性值的键值对:{'_Cat__name': 'heelo', 'age': 20, '__name': 'modified'} print(cat.__dict__) # 查看对象的所有属性与方法:['_Cat__name', 'age', '__name', '_Cat__base', 'num', '__init__', 'printdata', '__dict__'...] print(cat.__dir__()) #私有方法,带有__打头的方法,不允许通过对象调用,只能在类对象的方法调用 # python中所有私有方法都是假的,把私有__方法名 修改为 _类名__方法名实现的 # 所以直接通过对象访问会发现没有该方法名,所以如果通过修改后的名字是可以访问的 class BankService(object): def __init__(self, num): self.total = num def getMoney(self, count): if count > 0: self.__ModifyTotal(count * (-1)) def __ModifyTotal(self, count): self.total += count def printCount(self): print(self.total) bank = BankService(10000) bank.printCount() bank.getMoney(1000) bank.printCount() # bank.__ModifyTotal(2000) # 运行错误,提示没有该属性 bank._BankService__ModifyTotal(-2000) #调用成功 bank.printCount() # 查看对象的所有属性与属性值的键值对:{'total': 9000} print(bank.__dict__) # 查看对象的所有属性与方法:['total', '__init__', 'getMoney', '_BankService__ModifyTotal', 'printCount', '__dict__'...] print(bank.__dir__()) #对象关联,跟变量使用类似 class teacher(object): def __init__(self): self.student = [] def add_stu(self, stu): self.stu2 = stu #可以直接增加成员,如果成员存在就是赋值 self.student.append(stu) def printStu(self): print('stu,stu2',self.stu, self.stu2) for stu in self.student: print('list student:', stu) pass class student(object): pass tcher = teacher() stu1 = student() tcher.stu = stu1 #在teacher对象tcher里增加一个变量指向stu对象 print(tcher.__dict__) # {'stu': <__main__.student object at 0x0000016E054947A0>} stu2 = student() tcher.add_stu(stu2) #通过函数调用增加对象成员 stu3 = student() tcher.add_stu(stu3) #通过函数调用增加对象成员 print(tcher.__dict__) # {'stu': <__main__.student object at 0x0000016E054947A0>, 'stu2': <__main__.student object at 0x0000016E05494800>} tcher.printStu() # <__main__.student object at 0x000001EE7DFB49B0> <__main__.student object at 0x000001EE7DFB4A10> # 对象__str__()方法,默认是打印对象地址信息 class teacher(object): def __init__(self): self.book = None # None代表谁也不指向 self.student = [] def add_stu(self, stu): self.student.append(stu) def __str__(self): str ='' for i in self.student: str += (i + ' ') return str wang = teacher() wang.add_stu('lili') wang.add_stu('lilei') wang.add_stu('xiaoqiang') print(wang) #此处会调用teacher的__str__()方法,返回字符串,输出:lili lilei xiaoqiang
11-26
1031
06-05
246