类的属性和方法
类:用来描述具有相同属性和方法的对象的集合,管理操作一组特定数据的,通过私有变量和相应的方法保证数据的一致性和完整性
类变量 :在整个实例化对象中是公用的,在函数体外,通常不作为实例变量使用
实例变量:可以在类的外部直接给实例变量赋值,这样不太安全
实例方法
class Animal:
pass
class Person(Animal):
"""文档字符串“"”
count=0 //count是类变量
def __init__(self,name): //构造方法
self.name=name //name实例变量
Person.count+=1 //类变量的使用类名.变量名
def get_name(self): //get_name实例方法(self是必须的)
return self.name
@classmethod
def get_count(cls): //类方法(cls参数是必须的)
return cls.__name__ //查看类名(可以查看类的内置属性),cls.变量名
@staticmethod
def get_static(): //静态方法(第一个参数可没有)
print(“静态方法”)
p=Person("张三")
类变量的使用:Person.count(类名.类变量)或p.count(实例对象.类变量)
实例变量的使用:p.name(实例对象.实例变量)
实例方法:方法第一个参数必须为self,必须是实例对象调用p.get_name()
@classmethod类方法:方法的第一个参数必须为cls,类和实例都可以调用Person.get_count(),方法里面不能使用实例变量
@staticmethod静态方法:方法的第一个参数可没有,类和实例都可以调用静态方法Person.get_count(),方法里面不能使用实例变量
类的内置属性:
Person.__dict__ 和 p.__dict__ l输出的内容不一样,类的属性和对象的属性(包含一个字典,由类的数据属性组成)
Person.__doc__ ""注释""” 类的文档字符串 =="文档字符串"
Person.__module__类定义所在的模块 (如果类是在当前执行文件__main__,如果在其他文件则会返回其他文件名)
Person.__bases__ 类的所有父类构成元素 Animal
Person.__name__类名 Person
说明:不在类中的方法,类中的实例方法,类方法、静态方法均可调用
类的内置函数:
例1
class Animal:
pass
class Cat(Animal):
def __init__(self,name):
self.name=name
a=Animal()
c=Cat("加菲猫")
if issubclass(Cat,Animal): //判断Cat是Animal的子类吗
print("Animal是Cat的父类")
else:
print("Animal不是Cat的父类")
例2
class Cat:
def __init__(self,name):
self.name=name
c=Cat("加菲猫")
print(hasattr(c,'name')) //判断实例c是否存在属性name
print(getattr(c,'name')) //获取实例c的name属性
setattr(c,'name',"波斯猫") //设置实例c的name属性值为加菲猫
print(getattr(c,"nation","不存在nation属性" )) //获取nation属性,没有则返回字符串
delattr(c,'name') //删除实例c的name属性,没有不存在该属性则会报错
类的私有属性和方法: 以__开头的名字,只可以在类内部使用,不能在类的外部调用,增加了数据操作的间接性,为了增加操作数据的各种业务规则。
如果在类的外部使用使用属性或方法则会报错,内容:AttributeError: Animal instance has no attribute '_get_name'
class Animal:
__count=0 //私有类属性
def __init__(self,name): name为局部变量 self.name为实例变量
self.__name=name //私有实例变量
Animal.__count+=1
def __get_name(self): //私有实例方法
return self.__name
@classmethod
def __get_count(cls):
return Animal.__count
def show_get_name(self): //调用私有实例方法
return self.__get_name() //返回私有实例方法
def show_get_count(self):
print(self.__get_count()) //打印私有方法返回的结果
aobj=Animal("dog")
print(aobj.show_get_name()) //打印返回的结果
aobj.show_get_count()
单下划线、双下划线、头尾双下划线说明:
-
__foo__: 定义的是特殊方法,一般是系统定义名字 ,类似 __init__() 之类的。
-
_foo: 以单下划线开头的表示的是 protected 类型的变量,即保护类型只能允许其本身与子类进行访问,不能用于 from module import *
-
__foo: 双下划线的表示的是私有类型(private)的变量, 只能是允许这个类本身进行访问了。
类获取属性getattr
浙公网安备 33010602011771号