python类和对象、__init__(self)、__new__(cls,*agrs,**kwargs)、对象属性、__del__()

类和对象

  • 类:具有相同属性和方法的对象的集合;

  • 对象:万物皆对象;

  • 语法:

  • #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___());

猜你喜欢

转载自my.oschina.net/u/3764483/blog/1614172