类和对象安全
类编辑器
类:具备相同属性和方法的对象的集合;函数
对象:万物皆对象;测试
语法:spa
#class 类名: #属性 #方法
class Person: def eat(self): print("正在吃饭"); def sleep(self): print("正在睡觉");
class Student:#类的命名不能使用除下划线之外的其余字符,不能以数字开头,以大小写分割单词 pass#用于保证合适完整,保证语义完整
属性:.net
属性写在类外的状况,就是经过对象.属性,对象.方法()的方法调用orm
对象的三要素:属性(对象是什么)、方法(对象能作什么)、事件(对象如何响应)对象
相互关系:类是对象的抽象,对象是类的实例,类是一种抽象事物的分类,对象是一种实例;事件
class Student: def __init__(self,name,age): self.name=name; self.age=age; def showName(self): print("我叫{}".format(self.name)); zhangsan=Student('张三',30); zhangsan.showName();
class Student: def showName(self): print("我叫{}".format(self.name)); zhangsan=Student(); zhangsan.name='张三'; zhangsan.showName();
class Student: def showName(self): print("我叫{}".format(self.name)); zhangsan=Student(); zhangsan.name='张三'; zhangsan.name='ok';#第二个值会覆盖第一个值 zhangsan.showName();
__init__(self):系统自动调用初始化方法,先生成对象,再调用此方法,再将对象赋值给引用名内存
class Person: def __init__(self,name,age): self.name=name; self.age=age; print("执行init时就被调用了"); p=Person("ok",20); print(p.name); print(p.age); #执行结果: #执行init时就被调用了 #ok #20
__new__(cls,*agrs,**kwargs):在类调用init方法时,new方法决定是否要用init方法,由于new能够调用其余类的方法,或者返回别的对象来做为本类的实例;
new()方法的特性:
new()方法时在类准备将自身实例化时调用;
new()方法始终都是类的静态方法,即便没有被加上静态方法装饰器;
class Student: def __new__(cls, *args, **kwargs): print("执行__new__",args[0],args[1]); return object.__new__(cls);#固定语法 def __init__(self,name,age): print("执行__init__",name,age); self.name=name; self.age=age; def showName(self): print("姓名:{}".format(self.name)); zhangsan=Student("张三",22); zhangsan.showName();
对象属性:私有和共有
若是有一些属性不想给外部权限来访问或者修改,能够在属性或者方法的名字前加俩下划线__,声对象属性明为私有属性。则在外部调用该属性时返回ValueError.
class Person(object): def __init__(self, name): self.name = name; self._title = 'Mr'; self.__job = 'Student';#"__"声明为私有属性 p = Person('Bob'); print (p.name); print (p._title); print (p.__job);
封装
class Student: def __new__(cls, *args, **kwargs): print("执行__new__",args[0],args[1]); return object.__new__(cls);#固定语法 def __init__(self,name,age): print("执行__init__",name,age); self.name=name; self.__age=age; def getAge(self): return self.__age; def setAge(self,age): if age<0 or age>100: self.__age=18; else: self.__age=age; def showName(self): print("姓名:{}".format(self.name)); zhangsan=Student("张三",20); print('他的年龄',zhangsan.getAge()); zhangsan.setAge(40); print('他的年龄',zhangsan.getAge());
__del__():自动销毁方法
class Person: def __init__(self, name, age): self.name = name self.age = age def __del__(self): print("对象张三被销毁") zhangsan = Person("张三", 20) zhangsan.__del__();
测试一个对象被引用多少次:import sys(写在编辑器的顶端,起引入包的做用)
import sys#此行代码需写在编辑器头部 class Person: def __init__(self,name,age): self.name=name; self.age=age; zhangsan=Person("张三",20); print(sys.getrefcount(zhangsan));
访问私有属性能够经过 对象._类名__属性访问到(不建议用这个方法)
id()函数 查看对象的内存地址:print(id());
类属性:属于类成员,对象共有的;
类方法:cls 代表是 类
在方法上添加 @classmethod装饰器
def class_method(cls):
能够经过类方法调用类属性,也能够经过对象调用类属性;
修改类属性的2种方式:1.类名.类属性=... 2.实例对象__class__类属性=...
静态方法:前面加@staticmethod,静态方法能够加参数,与类和对象都没有关系,也能够经过类和对象调用;
class Person: @staticmethod def goHome(self, name, by): print(name, "回家...", by) Person.goHome("1","ok","自行车");
dir() :展现一个类/对象的内部属性和函数
__dir__ :展现一个类/对象的内部属性和函数
print(dir(zhangsan)); print(zhangsan.___dir___());