面向对象基础

A2:类与实例

类是什么?一切事物皆对象,即所有的东西都是对象,对象是可以看到、摸到、感觉到、听到、闻到、尝到的东西。对象是一个自包含的实体,用一组可识别的特性和行为来识别。

面向对象编程,就是object-oriented programming,就是针对对象进行编程。

首先,编写一个程序,猫叫。

# python
def cat_shut(): print("miao")
cat_shut()

如果别的python文件也想让猫叫呢?别的Python文件引用?

这个猫叫的函数有没有更合适的地方呢?就是类,类就是具有相同属性和方法的集合。

# python
class Cat: def cat_shut(self): print("miao")
  1.  类名第一个字母大写,如果是多个单词,每个单词的第一个字母大写
  2. 对外公开的方法没有修饰符。Python 中声明私有方法,请在方法名称的开头插入双下划线。

怎么用这个类呢?实例化就行。实例,就是一个真实的对象,比如我们都是「人」,我们都是「人」的实例。实例化就是创建对象的过程。

# python
cat = Cat() cat.cat_shut()

 A3:构造方法

希望出生的猫咪都有自己的名字,在猫叫的时候,说我叫什么名字,然后喵喵喵。此时,就需要构造函数。

构造方法,又叫构造函数,就是对类进行初始化。在类创建的时候,就是调用构造方法的时候了。

可是上面的代码,我们并没有实现构造方法呢?怎么调用的?

所有类都有构造方法,如果你没有定义,就会调用默认生成的空的构造方法。若有自定义的构造方法,默认的构造方法就失效了。

# python
class
Cat: def __init__(self, name): self.__name = name def cat_shut(self): print("my name is %s, miao" % self.__name) cat = Cat("mimi") cat.cat_shut()

C#程序如下

using System;
namespace HelloWorldApplication
{
    class Cat
    {
        private string name = "";
        public Cat(string name){
            this.name = name;
        }
        public string Shout(){
            return "my name is " + name + " miao";
        }
    }
   class HelloWorld
   {
      static void Main(string[] args){
          Cat cat = new Cat("abc");
          Console.WriteLine(cat.Shout());
      }
   }
}
  1. python中,两个下划线开头的为私有属性,否则会公有属性。
  2. 私有属性只允许类内部访问。

 A.4:方法重载

C#中,有的父母孩子生下来,并没有名字,如果写cat=Cat()就会报错。

如果猫咪即使没有名字,也要生下来,可以使用方法重载。

using System;
namespace HelloWorldApplication
{
    class Cat
    {
        private string name = "";
        public Cat(string name){
            this.name = name;
        }
        public Cat(){
            this.name = "无名";
        }
        public string Shout(){
            return "my name is " + name + " miao";
        }
    }
    
   class HelloWorld
   {
      static void Main(string[] args){
          Cat cat = new Cat("abc");
          Console.WriteLine(cat.Shout());
          Cat cat2 = new Cat();
          Console.WriteLine(cat2.Shout());
      }
   }
}

方法重载提供了创建多个同名方法的能力,这些方法具有不同的参数类型。而且,不仅构造方法可以方法重载,普通方法也是可以重载的。

方法重载的好处是什么?可以在不改变原有方法的基础上,新增功能。方法重载提供了扩展函数的能力。

如果要分清猫咪的姓和名,还可以再重载实现一个方法。eg

public Cat(string firstName, string secondName){
  xxxx }

================================================

但是Python是不支持方法重载的,假如声明多个方法同名,参数类型不同的方法,方法调用的时候,只会调用最后一个定义的同名方法。

但可以通过逻辑改变来实现方法重载。默认参数的形式。

class Cat:
    def __init__(self, name):
        self.__name = name

    def cat_shut(self):
        print("my name is %s, miao" % self.__name)

    def cat_eat(self, food="apple"):
        print("cat eat %s" % food)

cat = Cat("mimi")
cat.cat_shut()
cat.cat_eat("orange")
cat.cat_eat()

输出:

  my name is mimi, miao
  cat eat orange
  cat eat apple

 

A.5:属性与修饰符

 

posted on 2023-03-20 13:55  Y.Debby  阅读(37)  评论(0)    收藏  举报