类的属性和方法

类:用来描述具有相同属性和方法的对象的集合,管理操作一组特定数据的,通过私有变量和相应的方法保证数据的一致性和完整性

类变量 :在整个实例化对象中是公用的,在函数体外,通常不作为实例变量使用

实例变量:可以在类的外部直接给实例变量赋值,这样不太安全

实例方法

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

posted @ 2019-03-30 23:07  期待me  阅读(944)  评论(0)    收藏  举报