Python进阶练习--class基础

# __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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值