类和对象
类
-
类:具有相同属性和方法的对象的集合;
-
对象:万物皆对象;
-
语法:
-
#class 类名: #属性 #方法
- 定义一个类:
-
class Person: def eat(self): print("正在吃饭"); def sleep(self): print("正在睡觉");
-
class Student:#类的命名不能使用除下划线以外的其他字符,不能以数字开头,以大小写分割单词 pass#用于保证合适完整,保证语义完整
属性:
- 概念:用于访问类字段的成员;
- 属性用途:保证数据的安全,作数据的验证;
- 属性名:使用名词,说明操作对象、首字母小写、以大写字母分割单词
- 方法名:
- 使用谓词(动词+对象),说明对什么对象进行什么操作
- 首字母小写
- 以大写字母分隔单词
- updatePhone、a
- 属性相对于类来说属于全局,每个方法都可以调用;
- 属性分归属 : 类属性和对象属性
-
属性写在类外的情况,就是通过对象.属性,对象.方法()的方法调用
-
对象的三要素:属性(对象是什么)、方法(对象能做什么)、事件(对象如何响应)
-
相互关系:类是对象的抽象,对象是类的实例,类是一种抽象事物的分类,对象是一种实例;
- 对象属性的两种创建方法:
- 1、self:对象的载体
-
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();
- 2、通过 对象.属性()创建
-
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);
封装
- 1、私有化
- 2、设置get() set()方法
- get()和set()
-
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(写在编辑器的顶端,起引入包的作用)
- 语法:sys.getrefcount(t)返回 从2开始
-
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___());