类class学习

#创建一个类,并实现了这个类的初始化函数"__init__":
#count,books,name,age都被称为类的数据属性,但是它们又分为类数据属性和实例数据属性
#类的数据属性属于类本身,可以通过类名进行访问/修改
#类数据属性也可以被类的所有实例访问/修改
#在类定义之后,可以通过类名动态添加类数据属性,新增的类属性也被类和所有实例共有
#实例数据属性只能通过实例访问
#在实例生成后,还可以动态添加实例数据属性,但是这些实例数据属性只属于该实例
class Student(object):
    '''this is a Student class'''
    count = 0
    books = []
    def __init__(self,name,age):
        self.name = name
        self.age = age
    pass

Student.books.extend(['python','javascript'])
print('student book list:%s'%Student.books)
#类可以在类定义后添加类属性
Student.hobbies = ['reading','jogging','swimming']
print('student hobby list:%s'%Student.hobbies)

wilber = Student('Wilber',28)#创建一个实例
print('%s is %d years old'%(wilber.name,wilber.age))
#类实例可以添加新属性
#“gender”是实例属性,仅属于wilber
wilber.gender = 'male'
print('%s is %s'%(wilber.name,wilber.gender))
#类实例可以访问类属性
print(dir(wilber))
wilber.books.append('C#')
print(wilber.books)

will = Student('Will',27)#创建另一个实例
print('%s is %d years old'%(will.name,will.age))
# will shares the same class attribute with wilber
# will don't have the "gender" attribute that belongs to wilber
print(dir(will))
print('问题',will.books)

#打印Student类的所有属性
print(dir(Student))
#所有的类都有一组特殊的属性
print(Student.__name__)#类的名字(字符串)
print(Student.__doc__)#类的文档字符串
print(Student.__bases__)#类的所有父类组成的元祖
print(Student.__dict__)#类的属性组成的字典
print(Student.__module__)#类所属的模块
print(Student.__class__)#类对象的类型

#类数据属性属于类本身,被所有该类的实例共享,并且通过实例可以访问、修改类属性
#但是,在通过实例中访问类属性的时候一定要谨慎,因为可能出现属性隐藏的情况
#虽然通过实例可以访问类属性,但是不建议这么做,最好还是通过类名来访问类属性,从而避免属性隐藏带来的不必要麻烦
print('Student.count is wilber.count:',Student.count is wilber.count)#True
wilber.count = 1
print('Student.count is wilber.count:',Student.count is wilber.count)#False
print(Student.__dict__)
print(wilber.__dict__)
del wilber.count
print('Student.count is wilber.count:',Student.count is wilber.count)#True

wilber.count += 3
print('Student.count is wilber.count:',Student.count is wilber.count)#False
print(Student.__dict__)
print(wilber.__dict__)

print('Student.books is wilber.books:',Student.books is wilber.books)#True
wilber.books = ['c#','python']
print('Student.books is wilber.books:',Student.books is wilber.books)#False
print(wilber.books)
print(Student.books)
del wilber.books
print('Student.books is wilber.books:',Student.books is wilber.books)
print(Student.__dict__)
print(wilber.__dict__)

wilber.books.append('CSS')
print('Student.books is wilber.books:',Student.books is wilber.books)
print(wilber.books)
print(Student.books)
'''对于不可变类型的类型属性Student.count,可以通过实例wilber进行访问,并且Student.count is wilber.count
当通过实例赋值/修改count属性的时候,都将实例wiber新建一个count实例属性,这时Student.count is not wilber.count
当通过del wilber.count语句删除实例的count属性后,再次成为Student.count is wilber.count

同样对于不可变类型的类型属性Student.books,可以通过wilber进行访问,并且Student. books is wilber. books
当通过实例赋值books属性的时候,都将为实例wilber新建一个books实例属性,这时Student. books is not wilber. books
当通过实例修改books属性的时候,将修改wilber。books指向的内存地址(即Student.books),此时Student. books is wilber. books'''

class Student(object):
    '''this is a Student class'''
    count = 0
    books = []
    def __init__(self,name,age):
        self.name = name
        self.age = age

    #实例方法的第一个参数必须是self
    def printInstanceInfo(self):
        print('%s is %d years old'%(self.name,self.age))

    #类方法,第一个参数必须是cls,cls表示类本身,通过cls可以访问类的相关属性
    @classmethod
    def printClassInfo(cls):
        print(cls.__name__)
        print(dir(cls))

    #静态方法,没有参数限制,既不需要实例参数,也不需要类参数
    @staticmethod
    def printClassAttr():
        print(Student.count)
        print(Student.books)
    pass


#实例方法只能通过实例进行调用,这时候self就代表这个实例本身,通过self可以直接访问实例的属性
xiaoming = Student('Xiaoming',18)
xiaoming.printInstanceInfo()

#类方法可以通过类访问,也可通过实例访问
Student.printClassInfo()
xiaoming.printClassInfo()

#静态方法可以通过类名访问,也可以通过实例访问
Student.count = 3
Student.books = ['python','c++']
Student.printClassAttr()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值